• ベストアンサー

ManualResetEvent非同期処理で固まらないようにする

HttpWebRequestの非同期処理からデータを取得する際に ManualResetEventで完了したかどうかを待機していますが、 待機中はフォームが固まってしまいます。 非同期処理のIAsyncResult中にApplication.DoEvents();をしたら、 例外処理として落ちてしまいます。 ManualResetEvent非同期処理で固まらないようにするには、 マルチスレッドでイベントを起こすしかないのでしょうか? それともほかにいい方法があるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

非同期処理をしているのならマルチスレッドを組む必要はないのでは・・・? 具体的にどのようなコードを書いているのか不明なので、的確な回答は出せないかもしれませんが、質問を読む限り、ひとつのメソッド内ですべてを完了させようとしているのではないかと推測。 > ManualResetEventで完了したかどうかを待機していますが デリゲートの呼び出し先で、IAsyncResultのIsCompletedがTrueになるのを待っていればManualResetEventは不要です。 Private Sub HttpResponse(ByVal ar As IAsyncResult) If ar.IsCompleted Then 'ここに完了したあとの処理 End If End Sub ただし、このメソッドは別スレッドで呼び出されるので、コントロールに対する変更は受け付けません。次のようにControl.Invokeを使ってコントロールのあるスレッドへ呼び戻せば大丈夫です。 Private Sub HttpResponse(ByVal ar As IAsyncResult) If ar.IsCompleted Then Me.Invoke(New EventHandler(AddressOf DownloadComplete), ar, Nothing) End If End Sub Private Sub DownloadComplete(ByVal sender As Object, ByVal e As System.EventArgs) Dim ar As IAsyncResult = CType(sender, IAsyncResult) End Sub

関連するQ&A