Threading.Timer崩溃我的Winform应用程序?

时间:2012-10-30 14:41:31

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

我正在使用Threading.Timer每小时执行一个小时的任务,但是当计时器滴答时,应用程序总是在处理要在tick中执行的代码时崩溃。它没有异常或警告而崩溃,即使我把整个薄片放在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);

勾选事件:

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);
            }
        }
    }

1 个答案:

答案 0 :(得分:2)

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

取代取消,在这种情况下,最好取消Dispose()对象,创建一个新的BGW,因为它们就像“筹码便宜”。

我希望这会有所帮助。