私が必要とするすべてのプロセスが操作されるWinFormで作業しています。今では、BackgroundWorker
をProgressBar
と統合し、キャンセルボタンを自分のコードに組み込もうとしています。別の方法ではなく、自分のコードの周りにローカルに置いて欲しい。これをテストするために、進行中のバー(まだアクティブではない)とfor-loopを停止するボタンで新しいフォームが作成されます。ただし、コードは機能していません(プログレスバーはまだ含まれていません)。フォームはすぐにフリーズし(画像参照)、キャンセルボタンをテストすることはできません。ただしforループは実行され、"Done: " + l.ToString()
が表示されます。これをどうすれば解決できますか?BackgroundWorkerを使用したフォームのフリーズ
void stopMeasurement(object sender, EventArgs e)
{
stopMeas = true;
}
public void testcancel() // Test method which is triggered manually
{
int l = 0;
MetingProgress metingProgress = new MetingProgress();
metingProgress.btnCancelmeting.Click += new EventHandler(stopMeasurement);
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerSupportsCancellation = true;
worker.DoWork += (sender, args) =>
{
for (int k = 0; k < 10; k++)
{
Thread.Sleep(1000);
l++;
if (worker.CancellationPending)
break;
}
MessageBox.Show("Done: " + l.ToString());
};
worker.RunWorkerAsync();
while (worker.IsBusy)
{
if (stopMeas)
worker.CancelAsync();
}
metingProgress.Dispose();
MessageBox.Show("All done");
}
はい、私はすでに私の例のような設定をしたいので、backgroundworkerに入る必要があるいくつかのタスクのための私のコードを持っています。 forループは、実行するタスクに似ています。 – 10a
私は、 'testcancel'は実際には単にスレッドを起動してバックグラウンドで実行させる方法であり、実際にはそれがすべてです。スレッドは長い時間実行されるので、このメソッドではフォームの破棄を処理しないでください!それはスレッドメソッドの仕事だろう。 'MessageBox.Show(" All done ");'行は 'DoWork'イベントに属します。なぜなら、実際にスレッドが開始されるメソッドではなく、いつジョブ自体が完了するのかを知っているからです。 –