定时器被中断

时间:2012-11-29 11:13:20

标签: c# .net timer stream

我在Windows窗体应用中遇到问题。需要Timer记录归档时间的归档程序。然而有什么东西打断了计时器?

我怀疑是流。关于什么可能导致计时器中断的任何建议?

public partial class Form1 : Form
{
    int timerCounter = 0;
    System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();

    public Form1()
    {
        InitializeComponent();
        timer.Interval = 1000; 
        timer.Enabled = true;
    }

    public void button2_Click(object sender, EventArgs e)
    {
        timer.Start();
        timer.Tick += new EventHandler(timer1_Tick); 

        // code for archiving, streams

        timer.Stop(); 

        MessageBox.Show("Archive was created! :)");
    }

    public void timer1_Tick(object sender, EventArgs e)
    {
        this.label7.Text = (++timerCounter).ToString();
    }  

}

4 个答案:

答案 0 :(得分:7)

Windows窗体计时器不是多线程的。这意味着,tick事件仅在程序空闲时触发(通过其消息队列接收消息)。在你的程序中,似乎并非如此。您可以轻松地检查:如果您的用户界面在归档过程中有响应,那么Forms.Timer也会运行,问题出在其他地方。如果它没有响应,则表单(以及结果的计时器)被阻止(应用程序的消息队列中没有消息被处理)。

有两种方法:

  1. 要执行您想要实现的目标,您可以使用System.Timers.TimerSystem.Threading.Timer,因为它们在后台异步运行。 UI仍然不会更新(计时器方法会停止),但是,UI仍然被阻止(见上文)。
  2. 另一种方法是使用后台工作程序进行存档过程(然后在另一个线程中运行)。用户界面和计时器保持响应。

答案 1 :(得分:0)

首先,您应该知道长时间运行的操作应该在UI线程之外进行。因此,您创建了一个进行自我存档的处理线程,并使用Control.Invoke方法通知UI。 msdn description of Control.Invoke

答案 2 :(得分:-1)

最初,我认为您正在后台线程中执行归档。如果不是这样 - 你应该考虑使用BackgroundWorker在后台执行操作(这里是some examples)。

这是更简单的解决方案:

尝试在 button2_Click 处理程序中添加Application.DoEvents()(我猜您正在等待'streams'完成存档)。对于要触发的计时器和标签7重绘其新文本值,应该处理重绘事件。

答案 3 :(得分:-1)

此处使用计时器是不必要的,为什么不使用TimeSpan

public void button2_Click(object sender, EventArgs e)
{
    DateTime startTime = DateTime.Now;

    // code for archiving, streams

    TimeSpan diff = DateTime.Now - startTime;

    MessageBox.Show("Archive was created! in " + diff.TotalSeconds + " seconds.");
}