2009-05-14 2 views
5

.Netでは、そのメソッドの1つでDelegate.BeginInvokeを使用して非同期処理を開始するオブジェクトをインスタンス化し、そのオブジェクトへの参照をnullに設定するか、スコープから外れるようにしてオブジェクトを放棄するとします。非同期プロセスの進行中にガベージコレクタがオブジェクトを収集しようとしますか?そうでない場合は、オブジェクトを収集することを妨げているのは何ですか?放棄されたオブジェクトが非同期的にメソッドを実行している.NET GCが混乱しますか?

答えて

12

完全に管理されているコードの場合、それは収集されません。

発砲している代理人は、(あなたの説明から)オブジェクトの一部です。実行中は、オブジェクトへのアクティブな参照があります。デリゲートが完了すると、オブジェクトはコレクションの候補になります。

しかし、デリゲートでネイティブコードを呼び出す場合、ネイティブコードが完了する前にオブジェクトを実際にファイナライズできる状況がいくつかあります。詳細はMSDN forum threadをご覧ください。

+0

偉大な、完全な意味があります。私は今これで少し拡大する必要があります。 AsyncCallbackをBeginInvokeに渡して、非同期処理が完了したときにファイナライズ処理を行い、EndInvokeを呼び出すことができるようにしました。このAsyncCallbackが完了するまで、デリゲートの呼び出しが完了していないことは本当ですか?したがって、オブジェクトはAsyncCallbackが終了するまでコレクションの候補にはなりません。 –

+0

はい。 http://msdn.microsoft.com/en-us/library/system.runtime.remoting.messaging.asyncresult_members.aspxを参照してください - あなたの代理人、したがってオブジェクトのハンドルがAsyncDelegateプロパティにあります。コールバックが終了するまで、これはGCの候補にはなりません。 –

+0

パーフェクト、大変感謝しています。 –

関連する問題