5

バックグラウンド ワーカー スレッドで一連の時間のかかる操作を実行しています。さまざまな段階で、デリゲートを呼び出して (Windows フォームの) プログレス バーを更新します。ただし、より多くの時間操作の 1 つがコードの 1 行で発生します。

次のことは可能ですか?

a) コードの 1 行が実行されている間に UI を更新するか、少なくとも作業が行われていることをユーザーに示すアニメーション アイコンを表示します。

b)コードの1行が実行されている間、ユーザーがバックグラウンドワーカースレッドをキャンセルできるようにします

4

5 に答える 5

2

残念ながら、おそらくそうではありません。バックグラウンド ワーカー スレッドは ReportProgress を呼び出して UI スレッドを更新する必要があり、CancellationPending を監視して停止する必要があるかどうかを判断する必要があります。そのため、ワーカー スレッドが実行中の操作を 1 行で実行している場合、これを機能させる方法はありません。

おそらく、私は誤解しているので、ここに私が得ていることをシミュレートするコードがあります:

public void DoWork() {
    System.Threading.Thread.Sleep(10000);

    // won't execute until the sleep is over
    bgWorker.ReportProgress(100);
}
于 2008-11-11T22:37:10.387 に答える
1

ReportProgress()メソッドでUI (またはクラス プロパティ) を更新できます。

では、あなたが述べたように、長時間の操作が安定していて反応がない場合、その進捗状況をどのように計算しますか? それは明らかに不可能です。
操作をできるだけ多くのスニペットに分割し、各スニペットの後にReportProgress()を呼び出します。

于 2011-02-18T09:00:26.020 に答える
1

a) PictureBoxコントロールを使用して、プログレス バーの代わりにアニメーション GIF をフォームに表示できます。これを行う方法の詳細については、このブログ投稿を参照してください。

b) BackgroundWorkerクラスには、現在の操作をキャンセルする要求を送信するCancelAsyncメソッドがあります。
これにより、BackgroundWorker のCancellationPendingプロパティが「True」に設定されます。DoWorkイベント ハンドラーでは、値が変更されたときに適切なアクションを実行するために、このプロパティを定期的にポーリングする必要があります
また、これを機能させるには、BackgroundWorker のWorkerSupportsCancellationプロパティを「True」に設定する必要があることに注意してください。

于 2008-11-11T22:45:10.917 に答える
1

UI コードは、バックグラウンド ワーカーを開始する前にアニメーションを表示できます。キャンセルする必要がある場合は、バックグラウンド スレッドを終了できます。残念ながら、バックグラウンド ワーカーのデザインを利用することはできません。

于 2008-11-11T22:50:23.620 に答える
0

あなたは誤解していません - ReportProgress を使用するか、デリゲートを使用して (私がそうしているように) 本質的に同じ目標を達成します。

于 2008-11-11T22:47:25.047 に答える