8

を使用して、ループ内でBackgroundWorker呼び出していくつかの Web サイトをダウンロードしていました。WebClient.DownloadStringユーザーがダウンロードの途中でキャンセルできるオプションが欲しかったので、ループの途中でオンになってCancelAsyncいることがわかったときにいつでも電話しました。CancellationPending

DownloadStringしかし、関数が時々フリーズすることに気づいたので、DownloadStringAsync代わりに使用することにしました (これはすべて、で作成された他のスレッド内にありますBackgroundWorker)。そして、 を呼び出した後にループと関数を終了しなければならないことでコード全体を書き直したくないので、 をDownloadStringAsync呼び出した直後に while ループを作成しましたbool StopDownloadStringCompletedが呼び出されたとき、またはユーザーが操作のキャンセルを要求したとき。

さて、奇妙なことは、デバッグ バージョンで正常に動作することです。しかし、リリース 1 では、メイン スレッドであるかのように while ループでプログラムがフリーズします。

4

3 に答える 3

4

while ループで忙しく待っているように思えます。代わりにイベント シグナリングを使用する必要があります。待機ハンドル。解放モードでのビジー待機ループは、すべての CPU を消費し、フリーズ感を与える可能性があります。

DownloadStringCompleted で WaitHandle を通知するか、ユーザーがダウンロードをキャンセルした場合。

WaitHandle クラスに関するMSDN ドキュメントを確認してください。そこにも例があります。

于 2010-06-12T08:34:19.533 に答える
0

素敵なトピックです。バックグラウンド ワーカー プロセスで double while を使用しました

 int icounter = 1;
 while (icounter < SomeListInventory.Count)
            {
                while (pauseWorker == false)
                { 
                    //-----------------------
                    //DO SOME WORK
                        icounter++;
                    //-----------------------
                }
            }

そして、ボタンを一時停止します。それを押すと、pauseWorker (グローバル変数またはプロパティ) が true になり、icounter を増やすことなく、最初の while だけでループし、pauseworker=false を再度作成すると、プロセスが続行されます。

于 2012-01-18T08:49:42.920 に答える
0

キャンセルを確認している while ループを送信して、しばらくの間 (数ミリ秒) スリープ状態にします。これにより、他のスレッドやプロセスのために CPU ランタイムが解放されます。

于 2010-06-12T08:33:44.653 に答える