どのように私は、BackgroundWorkerのを一時停止することができますか?または似たような

StackOverflow https://stackoverflow.com/questions/3028021

質問

私は、ループ内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が再びプロセスは続行します

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top