【问题标题】:Threading.Timer crashing my Winform app?Threading.Timer 使我的 Winform 应用程序崩溃?
【发布时间】:2012-10-30 23:45:23
【问题描述】:

我使用 Threading.Timer 每小时执行一个任务,但是当计时器计时时,应用程序在处理要在计时中执行的代码时总是崩溃。它崩溃了,没有异常或警告,即使我把整个薄放在一个 try/catch 中。很奇怪。以下是我的设置,任何帮助将不胜感激!尝试访问 TextBox GrepCmdTextBox 时似乎崩溃了,但我认为从另一个线程读取是可以的,只是不写入。

设置定时器:

var timeOfDay = DateTime.Now.TimeOfDay;
var nextHour = TimeSpan.FromHours(Math.Ceiling(timeOfDay.TotalHours));
var delta = (nextHour - timeOfDay).TotalMilliseconds;
System.Threading.Timer NextHourTimer = new System.Threading.Timer(new System.Threading.TimerCallback(NextHourTimer_Tick), null, (long)delta, (long)TimeSpan.FromHours(1).TotalMilliseconds);

Tick 事件:

private void NextHourTimer_Tick(object sender)
    {
        // If thread is not null and is busy, cancel and restart
        if (MonitoringThread != null)
        {
            if (MonitoringThread.TailThread.IsBusy)
            {
                MonitoringThread.TailThread.CancelAsync();
                System.Threading.Thread.Sleep(50);

                // Get grep command, if specified
                string optionalGrep = String.Empty;
                if (GrepCmdTextBox.Text.StartsWith("grep") || GrepCmdTextBox.Text.StartsWith("egrep"))
                    optionalGrep = " | " + GrepCmdTextBox.Text;

                MonitoringThread.TailThread.RunWorkerAsync(optionalGrep);
            }
        }
    }

【问题讨论】:

  • 运行时必须抛出一些异常。启用所有异常的抛出并告诉我们它在做什么......
  • @Killercam 我不认识,我什么也没看到……这个启用所有例外的选项在哪里?
  • 如果您使用的是 VS2010,那么,首先您可以从菜单“调试”>“异常...”中启用自动抛出任何异常。然后检查所有 CLR 异常并重新运行代码。添加您可能认为相关的其他例外。如果这不起作用,这可能是一个非托管代码异常。这次,转到您的项目属性,然后在“调试”选项卡上;选中“启用非托管代码调试” - 然后告诉我们您看到了什么:此时我可能(或可能不会!)能够进一步帮助您...
  • @Killercam 感谢您的提示!我现在看到的新异常是 BackgroundWorker 尚未从 CancelAsync() 完全取消,所以我想等待 50 毫秒还不够长......在我打电话之前有更好的方法循环直到它完全取消 @987654325 @?
  • 我想在这种情况下处理对象并重新创建它并不是不合理的,因为它是每小时一次。

标签: winforms c#-4.0 timer thread-safety


【解决方案1】:

取消异步进程可能需要一些时间,后台线程必须“完成”,从 DoWork() 返回并等待运行 RunWorkerCompleted 事件的机会(如果有)。

而不是取消,在这种情况下,最好先取消 Dispose() 对象,创建一个新的 BGW,因为它们是“便宜的芯片”。

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 2013-08-20
    • 2021-08-28
    • 2012-05-09
    • 2010-11-08
    • 2014-01-24
    • 1970-01-01
    相关资源
    最近更新 更多