6

重複の可能性:
すべての BeginInvoke の後に EndInvoke が続く必要がありますか?
EndInvoke() はオプションですか、一種のオプションですか、それとも絶対にオプションではありませんか?

マルチスレッド アプリケーションを使用しており、セカンダリ スレッドの 1 つは、数分ごとにメイン スレッドで実行するコードを取得する必要があります。戻り値はなく、2 番目のスレッドは、例外が発生したり実行に失敗したりしても気にしません。

これまでのところ、 を介してコードを実行するようにしていますがForm.Invoke、通常よりもはるかに長く (数秒) かかることがあり、完了するまでスレッドをブロックします。数秒間停止することなく実行を継続できるようにするには、2 番目のスレッドが必要です。

BeginInvokeうまく機能するように聞こえますが、EndInvokeを待機したり戻り値を取得したりしたくないので、 を呼び出す場所が実際にはありません。また、呼び出されるコードに一連のネイティブ呼び出しが含まれていることを考えると、そうしないのが良い考えかどうかはわかりませんEndInvoke

まったく呼び出す必要EndInvokeがありますか、または代わりに使用する必要があるコードをメインフォームスレッドで非同期に実行する他の方法がありますか?

ありがとう =)

4

3 に答える 3

6

必要に応じて、 EndInvokeを呼び出してデリゲートから戻り値を取得できますが、これは必須ではありません。EndInvoke は、戻り値を取得できるまでブロックします。

ソース: http://msdn.microsoft.com/en-us/library/0b1bf3y3.aspxの備考

于 2011-06-30T05:16:15.973 に答える
4

EndInvoke を呼び出す一般的な方法の 1 つは、BeginInvoke に完了コールバックを含めて、コールバックで EndInvoke を呼び出すことができるようにすることです。これは、BeginRead/EndRead など、Invoke よりも具体的なことを行う Begin/End メソッドにとってより重要です。後者の場合、End はクリーンアップに必要な場合があり、通常はプロセス中に発生した例外を (再) スローします。

于 2011-06-30T05:04:15.320 に答える
3

EndInvoke が呼び出されることを確認する必要がありますが、次のように非常に簡単に実行できます。

  var action = new Action(SomeMethodGroup); 

  action.BeginInvoke(new AsyncCallback(

        x => (x.AsyncState as Action).EndInvoke(x)), action); 
于 2011-06-30T05:03:38.937 に答える