Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 暂停计时器不会';它似乎不能正常工作_C#_Timer - Fatal编程技术网

C# 暂停计时器不会';它似乎不能正常工作

C# 暂停计时器不会';它似乎不能正常工作,c#,timer,C#,Timer,我写了一个应用程序,每10秒通过FTP下载一次文件,我有下面的计时器代码 timer3.Tick += new EventHandler(updateLogs); timer3.Interval = (1000) * (10); timer3.Enabled = true; timer3.Start(); 我的updateLogs函数: timer3.Enabled = false; server1_log = downloadLog("192.168.0.217", 1); server2_

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

timer3.Tick += new EventHandler(updateLogs);
timer3.Interval = (1000) * (10);
timer3.Enabled = true;
timer3.Start();
我的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;
我意识到请求可能需要10秒以上的时间,这就是为什么我在调用downloadLog()之前禁用计时器,之后启用计时器的原因

不过,大约一分钟后,应用程序冻结,CPU使用率跳升至45%。当我注释掉timer3的代码时,应用程序可以长时间正常运行,并且从不崩溃


有什么想法吗?

如果您使用的是
System.Windows.Forms.Timer
,您应该会想到这种行为。尽管这个类让您产生了异步执行操作的假象,但实际上它使用UI线程来完成实际工作。因此,如果计时器执行的逻辑被卡住,UI也会被卡住


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

在.NET BCL中有三个
Timer

  • 最适合您的需求是(关于这一点的讨论将相当长。有关更多信息,最好您阅读)


    在异步工作和更新UI时,您还需要知道的是,您不能/不应该直接从工作线程访问UI。看看。

    如果您使用的是
    System.Windows.Forms.Timer
    ,您应该会遇到这种行为。尽管这个类让您产生了异步执行操作的假象,但实际上它使用UI线程来完成实际工作。因此,如果计时器执行的逻辑被卡住,UI也会被卡住


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

    在.NET BCL中有三个
    Timer

  • 最适合您的需求是(关于这一点的讨论将相当长。有关更多信息,最好您阅读)


    在异步工作和更新UI时,您还需要知道的是,您不能/不应该直接从工作线程访问UI。请看。

    您的计时器3是类成员还是局部变量?可能问题不在于计时器,而在于
    downloadLog()
    ?您使用的计时器类属于哪个命名空间?命名空间WindowsFormsApplication1。timer3是在类构造函数中启动的类变量。@Krzysiek我想Nikola想知道您使用的是哪一个。您的timer3是类成员还是局部变量?也许问题不在于计时器,而在于
    downloadLog()
    ?您使用的timer类属于哪个命名空间?命名空间WindowsFormsApplication1。timer3是在类构造函数中启动的类变量。@Krzysiek我想Nikola想知道您使用的是哪一个。