3

この投稿の例に似たコードを書きました: .NET Remotingコールバック (コールバックオブジェクトをリモートメソッドに渡します)。

私が知ったように、オーバーライドしなかった場合MarshalByRefObject.InitializeLifetimeService() 、しばらくすると、サーバーはコールバックの呼び出しに失敗しました。だから私はそれをオーバーライドしてnull(無限の寿命)を返し、それは機能します。

しかし今、私はゴミ収集について少し心配しています:

  1. そのようなオブジェクトは通常どおりGCによって収集されますか、それともリモートであるために存続しますか?
  2. 私はこの方法を見つけました:RemotingServices.Disconnect()

コールバックオブジェクトで呼び出すと、ライフタイムポリシーが無関係になり、ガベージコレクションが行われることが保証されますか?

私がそれを正しくやっていれば、私は専門家の意見が欲しかった。

ありがとう、ギル。

PS。私は.NET2.0の制約の下で作業しているため、WCFに切り替えることをお勧めしますが、正しいとは言えません。:)

4

2 に答える 2

3

わかりました、アプローチはそれ自体を証明したようです。

で null を返すことにより、無制限のリースを使用しましたMarshalByRefObject.InitializeLifetimeService()
次に、呼び出しRemotingServices.Disconnect()により、オブジェクトを適切に解放できました。

于 2013-06-13T09:02:02.810 に答える
0

InitializeLifetimeServiceをオーバーライドしてnullを返すと、オブジェクトがガベージコレクションされることはありません。

インスタンスを永久に存続させたくない場合は、スポンサーとリースに移動する必要があります。基本的に、.NETがリースの有効期限が切れようとしているときにコールバックを受け取り、オブジェクトをGCして、リースを更新する機会を与えます。

スポンサーシップとリースの概要については、http://msdn.microsoft.com/en-us/magazine/cc300474.aspxを参照してください。

于 2012-10-03T22:48:18.013 に答える