我有一个状态栏标签,我想在StatusBar标签上显示一段文字仅3秒
如何在不使用线程的情况下执行此操作?
public void InfoLabel(string value)
{
if (InvokeRequired)
{
this.Invoke(new Action<string>(InfoLabel), new object[] { value });
return;
}
infoLabel.Text = value;
}
答案 0 :(得分:6)
只需在方法的末尾添加计时器:
if (!string.IsNullOrWhiteSpace(value))
{
System.Timers.Timer timer = new System.Timers.Timer(3000) { Enabled = true };
timer.Elapsed += (sender, args) =>
{
this.InfoLabel(string.Empty);
timer.Dispose();
};
}
答案 1 :(得分:3)
你需要定义一个你每次需要显示文本时调用的函数,在这个函数中定义一个定时器,这个定时器基于System.Windows.Forms.Timer
,唯一的区别是它被修改为持有一个表示运行持续时间的stopTime
参数,您唯一需要做的就是将您的起始代码(显示文本)放在MyFunction
函数中,并将结束代码(停止显示文本)放在里面Timer_Tick
函数,一旦调用MyFunction
,只需指定在函数参数中运行多少秒。
private void MyFunction(int durationInSeconds)
{
MyTimer timer = new MyTimer();
timer.Tick += new EventHandler(Timer_Tick);
timer.Interval = (1000) * (1); // Timer will tick every second, you can change it if you want
timer.Enabled = true;
timer.stopTime = System.DateTime.Now.AddSeconds(durationInSeconds);
timer.Start();
//put your starting code here
}
private void Timer_Tick(object sender, EventArgs e)
{
MyTimer timer = (MyTimer)sender;
if (System.DateTime.Now >= timer.stopTime)
{
timer.Stop();
//put your ending code here
}
}
修改后的计时器类
public class MyTimer : System.Windows.Forms.Timer
{
public System.DateTime stopTime;
public MyTimer()
{
}
}
答案 2 :(得分:1)
您可以使用Timer创建一个计时器实例,在触发n
事件之前等待Elapsed
秒。在已用完的事件中,您清除了标签Content
。
由于计时器是在一个单独的线程中执行的,因此在计时器计数时不会锁定UI线程,即您可以在UI中自由执行其他操作。
private delegate void NoArgDelegate();
private void StartTimer(int durationInSeconds)
{
const int milliSecondsPerSecond = 1000;
var timer = new Timer(durationInSeconds * milliSecondsPerSecond);
timer.Start();
timer.Elapsed += timer_Elapsed;
}
private void timer_Elapsed(object sender, ElapsedEventArgs e)
{
var clearLabelTextDelegate = new NoArgDelegate(ClearLabelText);
this.Dispatcher.BeginInvoke(clearLabelTextDelegate);
}
private void ClearLabelText()
{
this.myLabel.Content = string.Empty;
}
由于我没有其他代码,因此一些建议是在计时器上创建一个锁,以防止启动计时器的多个UI事件。此外,委托和计时器实例可以作为类的private
成员。
答案 3 :(得分:0)
您将始终至少使用GUI线程。如果您决定在该线程上等待,则不可能与控件进行其他交互(即,没有按钮可以工作,窗口将不会重新绘制)。
或者,您可以使用System.Windows.Forms.Timer
将控制权交还给操作系统或其他类型的计时器。无论哪种方式,“倒计时”将阻止用户交互或发生在另一个线程上(在引擎盖下)。