1

Threading.Timer を使用して 1 時間ごとにタスクを実行していますが、タイマーが刻むと、刻みで実行するコードを処理するときにアプリが常にクラッシュします。薄い全体を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);
            }
        }
    }
4

1 に答える 1

2

非同期プロセスのキャンセルには時間がかかる場合があります。バックグラウンド スレッドは、DoWork() から戻り、RunWorkerCompleted イベントを実行する機会があればそれを待機して「ファイナライズ」する必要があります。

キャンセルする代わりに、この場合Dispose()はオブジェクトをキャンセルして新しい BGW を作成する方が良いでしょう。

これが役立つことを願っています。

于 2012-10-30T15:45:23.500 に答える