Delegate.EndInvoke() は本当に必要ですか? 質問する

Delegate.EndInvoke() は本当に必要ですか? 質問する

Delegate.BeginInvoke を使用する場合は Delegate.EndInvoke が必要であると述べているフォーラムや、stackoverflow の質問をいくつか読みました。BeginInvoke の使用について説明している記事の多くでは、EndInvoke の使用について触れられていませんでした。また、BeginInvoke のみを使用して実稼働コードをデプロイしましたが、メモリの問題は発生していないようです。私が BeginInvoke を使用したのは、通常、スレッドがいつ終了するか、または処理にどのくらいの時間がかかるかを気にしないスレッドの場合です。

ベストアンサー1

MSDNの記事より「同期メソッドを非同期的に呼び出す」:

どちらの手法を使用する場合でも、非同期呼び出しを完了するには常に EndInvoke を呼び出します。

さて、理論と実践があります。あなたも、他の多くの開発者と同様に、この文書化された要件を無視しても問題ないことに気付いたでしょう。EndInvokeアプリケーションのクラッシュやメモリ リークなどを防ぐために絶対に必要なことを実際に行うかどうかは、実装の詳細である可能性があります。しかし、次の点に注意してください。文書化された要件であれば、必ず実行すべきですこれは単なる理論ではなく、変化の際に自分自身を守るためのものです。

この要件を文書化することで、この非同期呼び出しメカニズムの設計者は、方法を変更しBeginInvokeEndInvoke作業を進める自由を基本的に与えたことになります。そのため、十分な理由(たとえば、パフォーマンスの向上)があれば、EndInvoke突然、それがより必要になることがあります。これを忘れると、突然デッドロックが発生すると仮定します。彼らはすでに次のように言って、自分たちを守っています。いつも電話するEndInvoke; この要件に従わなかったためにアプリが動作しなくなった場合、その責任はあなたにあります。

これは必ずしも起こり得るシナリオだと言っているのではありません。私が言いたいのは、少なくともそうすべきではないということです。私はそうしない「これは本当に必要なのか?」という心構えでそれを省いてもいいなら、そうするよ、それはそれを実行する必要があることが文書化されています。

おすすめ記事