どのように私は、BackgroundWorkerのを一時停止することができますか?または似たような
-
26-09-2019 - |
質問
私は、ループ内BackgroundWorker
を呼び出すことによって、いくつかのウェブサイトをダウンロードするWebClient.DownloadString
を使用していました。私はそれCancelAsync
がループの途中で上がわかった時はいつでも、私はCancellationPending
と呼ばれるので、私は、ものをダウンロードの途中でキャンセルするユーザーのためのオプションを望んでいました。
DownloadString
で作成した他のスレッド内でこのすべてを)代わりにDownloadStringAsync
を使用することを決めたので、しかし、今私は、関数BackgroundWorker
はちょっと時々フリーズすることに気づきました。私はDownloadStringAsync
を呼び出した後、ループや機能を終了することによって、私の全体のコードを書き換えることはしたくないので、私はどちらかの時に真のターンという変数bool Stop
には何もなく、チェックしませんようにそれを呼び出した後にwhileループを右に作られましたユーザの要求が操作をキャンセルするときDownloadStringCompleted
イベントハンドラが呼び出されますか。
今、奇妙なことは、それがデバッグバージョンに罰金を動作することです。しかし、リリース1に、プログラムはメインスレッドであれば同様whileループでフリーズします。
解決
サウンド、あなたがビジー待ちwhileループです。あなたは、例えば、代わりのシグナル伝達イベントを使用する必要があります。 WaitHandle。リリースモードでのビジー待ちのループは非常によくフリーズ感を与えて、すべてのあなたのCPUを消費することがあります。
信号WaitHandle DownloadStringCompletedまたはユーザーがダウンロードをキャンセルした場合。
WaitHandleに MSDNドキュメントのを確認してくださいクラス。例では、そこにもあります。
他のヒント
しばらくスリープ状態にキャンセル(一部MS)をチェックして、あなたのwhileループを送信します。これは、他のスレッドやプロセスのCPU実行時間を解放ます。
素敵な話題、私が使用します 私のバックグラウンドワーカープロセスでダブルしばらく
int icounter = 1;
while (icounter < SomeListInventory.Count)
{
while (pauseWorker == false)
{
//-----------------------
//DO SOME WORK
icounter++;
//-----------------------
}
}
私はそれを押すと、pauseWorker(グローバル変数やプロパティが)icounterを増加させることなく、真になると、最初の間でループすることをと私は、ボタンのポーズを持っている、と私はpauseworkerを作るとき= falseが再びプロセスは続行します