C#在文本框中显示计时器

时间:2013-09-23 12:14:19

标签: c# timer textbox

我正在尝试在文本框中运行计时器,但我没有运气。

这是我正在使用的代码:

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);
}

它工作正常。任何人都知道为什么它不能使用我的文本框?

6 个答案:

答案 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

enter image description here

答案 5 :(得分:0)

可能在Application.DoEvents();之后使用TimeTb.Text = e.SignalTime.ToString();,但不建议使用{{1}}。