0

私はBackgroundWorker _worker

void _worker_DoWork(object sender, DoWorkEventArgs e)
{
    _timer = new System.Timers.Timer();
    _timer.Elapsed += new System.Timers.ElapsedEventHandler(_timer_Elapsed);
    _timer.Interval = 5000;
    _timer.Start();
}

それがライン_timer.Start()に到達すると、それは終了したと思うので、発砲しRunWorkerCompleted eventます。

_timer.Interval時間に達し、_timer Elapsed eventトリガーされるまで、それを終了させたくありません。

void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    for (int i = 1; i < 20; i++)
    {
        if (listBox1.InvokeRequired)
            listBox1.Invoke((Action)(() => listBox1.Items.Add("Do Things Thread")));
        else
            listBox1.Items.Add("Do Things Completed");

        _worker.ReportProgress((int)(((decimal)i / (decimal)20) * 100));

        Thread.Sleep(1000);
    }

    _timer.Stop();
}

BackgroundWorker進捗状況を報告する必要があるためです。

これを行うにはどうすればよいですか。別ので実行する必要がありますthread

4

3 に答える 3

1

それで、議論と解決策をまとめます。

MSDNで説明されているように、同期オブジェクトを指定しない限り、System.Timers.Timerはタイマーイベントを自動的にスレッド化します。

SynchronizingObjectプロパティがnullの場合、ElapsedイベントはThreadPoolスレッドで発生します。Elapsedイベントの処理がIntervalより長く続く場合、イベントは別のThreadPoolスレッドで再度発生する可能性があります。この状況では、イベントハンドラーは再入可能である必要があります。

これは、バックグラウンドワーカーが過剰になることを意味します。タイマーイベントコードをそのまま実行することができます(とにかくUIと対話するためにinvokeを使用するため)。

これは、これらのイベントに時間がかかる場合、これらのイベントが同時に実行される可能性があることを意味します。ただし、もちろん、イベントコールバックでタイマーを停止および開始することはできます。

于 2013-01-10T16:12:07.980 に答える
0

_timer_Elapsedイベントは別のスレッドにあります。タイマーのインスタンスは、制御フローが_worker_DoWork関数を通過するとすぐに期限切れになります。タイマーオブジェクト変数のスコープは関数に制限されているため、このようには機能しません。

put Thread.sleep(5000)をtimer_worker_dowork関数自体に入れることをお勧めします。スレッドはスリープ状態になり、GUIは引き続き応答するため、アプリケーションには影響しません。

于 2013-01-10T13:28:04.323 に答える
0

私がやったことをいじくり回しただけで、プログレスバーを呼び出したので、ReportProgressは必要ないと思います。

_worker.ReportProgress((int)(((decimal)i / (decimal)20) * 100));

に変更されました:

if (progressBar1.InvokeRequired)
    progressBar1.Invoke((Action)(() => progressBar1.Value = (int)(((decimal)i / (decimal)20) * 100)));
else
    progressBar1.Value = (int)(((decimal)i / (decimal)20) * 100);

つまり、BackgroundWorkerを一時停止する必要はなく、タイマーは別のスレッドで呼び出され、破棄されるまで残りますか????

于 2013-01-10T13:33:05.387 に答える