我正在尝试在文本框中运行计时器,但我没有运气。
这是我正在使用的代码:
private static System.Timers.Timer timer;
...
private void StartBtn_Click(object sender, EventArgs e)
{
timer = new System.Timers.Timer(1000);
timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
timer.Enabled = true;
}
...
private void OnTimedEvent(object source, ElapsedEventArgs e)
{
TimeTb.Text = e.SignalTime.ToString();
}
但没有任何反应。
我试过了:
private void OnTimedEvent(object source, ElapsedEventArgs e)
{
MessageBox.Show(e.SignalTime.ToString(),
"Question", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
}
它工作正常。任何人都知道为什么它不能使用我的文本框?
答案 0 :(得分:4)
Elapsed Event在不同的线程上运行,然后在UI上运行。它不允许从不同的线程操纵UI对象,并且在EventHandler中会出现异常。由于您不处理异常,因此您不会注意到它。
在StartBtn_Click
中将Timer的SynchronizingObject
属性设置为此(表单)。然后经过的事件将与主线程同步。
答案 1 :(得分:1)
可能是你应该先启动计时器。
看看:
http://msdn.microsoft.com/en-us/library/system.timers.timer.start.aspx
添加:
timer.Start();
答案 2 :(得分:1)
在try catch
周围放置一个OnTimedEvent
,看看是否存在线程问题。
如果有,请尝试使用可以解决交叉线程问题的System.Windows.Forms.Timer
。
http://msdn.microsoft.com/en-us/library/system.windows.forms.timer.aspx
如上所述:
实现以用户定义的间隔引发事件的计时器。 此计时器已针对Windows窗体应用程序进行了优化,并且必须 在窗口中使用。
答案 3 :(得分:1)
您的OnTimedEvent回调将不会在UI线程上调用,因此您在尝试设置文本框文本时会遇到异常。因此,您需要将事件处理程序更改为:
private void OnTimedEvent(object source, ElapsedEventArgs e)
{
if (TimeTb.InvokeRequired)
{
TimeTb.Invoke((MethodInvoker)delegate
{
OnTimedEvent(source, e);
});
}
TimeTb.Text = e.SignalTime.ToString();
}
答案 4 :(得分:0)
private void Button_Click(object sender, RoutedEventArgs e)
{
this._timer = new DispatcherTimer();
this._timer.Interval = TimeSpan.FromMilliseconds(1);
this._timer.Tick += new EventHandler(_timer_Tick);
_timer.Start();
}
void _timer_Tick(object sender, EventArgs e)
{
t= t.Add(TimeSpan.FromMilliseconds(1));
textBox.Text = t.Hours + ":" + t.Minutes + ":" + t.Seconds + ":" + t.Milliseconds;
}
编辑:
如何添加程序集:WindowsBase
答案 5 :(得分:0)
可能在Application.DoEvents();
之后使用TimeTb.Text = e.SignalTime.ToString();
,但不建议使用{{1}}。