3

ユーザーが特定のボタンをクリックした場合に、WebClientのDownloadStringAsyncメソッドを使用してhtmlページをダウンロードしています。現在の操作が完了する前に停止して新しい操作を開始したい場合は、CancelAsyncメソッドを呼び出し、WebClientオブジェクトをnullに設定します。2番目のボタンのイベントハンドラーでも、WebClientオブジェクトを再初期化し、最後に新しいコンテンツのダウンロードを試みます。WebClientオブジェクトはグローバル変数です。私が得ているエラーは次のとおりです。

WebClient does not support concurrent I/O operations. 

WebClientに現在の操作をキャンセルして新しい操作を開始するように強制する方法はありますか?

4

3 に答える 3

3

これは、最初のダウンロードが完了する前に、同じWebClientのインスタンスで2番目のファイルをダウンロードしようとしているようです。WebClientの新しいインスタンスを作成すると、その問題は確実に解決されます。CancelAsync()は進行中のダウンロードをキャンセルしようとしますが、しばらくの間実行されている可能性があります。ダウンロードが完了/キャンセルされると、DownloadStringCompletedイベントハンドラーが発生し、WebClientの同じインスタンスで新しいダウンロードを開始できるようになります。

于 2012-12-09T12:04:57.987 に答える
1

表示されているエラーは、許可されていない WebClient のクロススレッド使用の試みのように聞こえます。つまり、最終的に DownloadStringAsync を呼び出す同じスレッドで WebClient を作成する必要があります。わかる?デザインを少し考え直す必要があります。WebClient のインスタンスをグローバルにアクセスできるようにしたい場合は、ThreadLocalAttribute の使用を検討してください。

于 2012-12-07T01:58:29.353 に答える