暂停计时器似乎无法正常工作

Krz*_*iek 0 c# timer

我写了一个应用程序,每10秒通过FTP下载文件,我有以下计时器的代码.

timer3.Tick += new EventHandler(updateLogs);
timer3.Interval = (1000) * (10);
timer3.Enabled = true;
timer3.Start();
Run Code Online (Sandbox Code Playgroud)

我的updateLogs函数:

timer3.Enabled = false;
server1_log = downloadLog("192.168.0.217", 1);
server2_log = downloadLog("192.168.0.216", 2);
server3_log = downloadLog("192.168.0.215", 3);
timer3.Enabled = true;
Run Code Online (Sandbox Code Playgroud)

我意识到请求可能需要超过10秒,这就是为什么我在调用downloadLog()之前禁用定时器,然后启用它.

不过,大约一分钟后,应用程序冻结,CPU使用率跃升至45%以上.当我注释掉timer3的代码时,应用程序运行很长时间并且永远不会崩溃.

有任何想法吗?

Nik*_*vić 5

如果你正在使用System.Windows.Forms.Timer你应该期待这种行为.虽然这个类让你觉得它异步执行操作,但它实际上是使用UI线程来完成实际的工作.因此,如果您的计时器执行的逻辑卡住,您的UI也会被卡住.


为了缓解这种情况,你应该使用实际上可以在后台线程上工作的计时器,或者使用BackgroundWorker.

Timer.NET BCL中有三个类.

  1. System.Windows.Forms.Timer
  2. System.Threading.Timer
  3. System.Timers.Timer

最适合您的需求是System.Timers.Timer(关于这个问题的讨论会相当长.有关更多信息,请阅读MSDN杂志文章,比较这三者).

在异步进行工作并更新UI时,您还需要知道的是,您不能/不应该直接从工作线程访问UI.看看关于这个主题的SO问题.