25

Windows フォーム アプリケーションの非同期性について説明している MS ドキュメントのこのページには、次のように記載されています。

必要に応じて、EndInvoke を呼び出してデリゲートから戻り値を取得できますが、これは必須ではありません。(強調追加)

非同期デリゲートの一般的なケースをカバーするこのページでは、別のことが述べられています。

どの手法を使用する場合でも、必ず EndInvoke を呼び出して非同期呼び出しを完了してください。

この二つは真っ向から対立しているようです。

どれが本当ですか? 誰か説明できますか?

Phil Haack による投稿も参照してください。

関連:EndInvokeはオプションですか、一種のオプションですか、間違いなくオプションではありませんか?

4

3 に答える 3

23

インターフェイスのドキュメントで明示的に別段の指示がない限り、BeginInvoke を呼び出すすべての場所で EndInvoke を呼び出す必要があります。主な理由は、BeginInvoke 呼び出し (WaitHandle など) に割り当てられる可能性のある特定のリソースを所有者が安全に解放できるのは、EndInvoke だけだからです。

しかし、この規則には例外があります。Control.BeginInvoke などの API は EndInvoke を必要としませんが、ドキュメントで明示されています。

于 2009-08-13T20:09:46.617 に答える
14

どちらも真実です - それらは異なる呼び出しです。

一般EndInvokeに、非同期呼び出しによって取得されたすべてのリソースが確実に解放されるように、常に呼び出す必要があります。

ただし、Windows フォーム チームは、 に対してこれを行う必要がないことを保証していますControl.Invoke。ただし、他の実装ではそれを行う必要があるかもしれませISynchronizeInvokeん。

于 2009-08-13T20:09:31.420 に答える
1

結果が「利用可能であれば役立つが、必須ではない」という結果になる前に、デリゲートでファイア アンド フォーゲット メソッドを使用しました。その方法では完了が保証されないことを覚えておいてください。特に、私がそれを使用する場所の 1 つは次のとおりです。

  • アプリケーションの更新を確認するデリゲートを開始する
  • デリゲートはタイムアウトで Web リクエストを開始します
  • エラー/タイムアウトが発生した場合、またはアプリケーションが最新の場合、メソッドは単純に戻ります
  • アプリケーションが古くなっている場合は、フォーカスを盗まないシステム トレイ メッセージを表示します (更新が利用可能でない限り、システム トレイ アイコンは表示されません)。

どちらの方法でも、アプリケーションは中断されずに続行されます。

于 2009-08-13T20:13:08.713 に答える