我在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();
}
}
答案 0 :(得分:7)
Windows窗体计时器不是多线程的。这意味着,tick事件仅在程序空闲时触发(通过其消息队列接收消息)。在你的程序中,似乎并非如此。您可以轻松地检查:如果您的用户界面在归档过程中有响应,那么Forms.Timer
也会运行,问题出在其他地方。如果它没有响应,则表单(以及结果的计时器)被阻止(应用程序的消息队列中没有消息被处理)。
有两种方法:
System.Timers.Timer
或System.Threading.Timer
,因为它们在后台异步运行。 UI仍然不会更新(计时器方法会停止),但是,UI仍然被阻止(见上文)。答案 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.");
}