問題の処理ソケット/最終段階に。
質問
ように一部のコードなんかの点からの信頼が厚く)のためのクラスをソケットは、要求を立ち上げのための対応は、例外の方法でできない理解が試ルにI 想 同じ例外が"ライブ"が、クラスによって参照されるシングルトンなのでしょうかを隠します。
問題の現しています。CannotUnloadAppDomainException:エラーが荷揚appdomain"のルや内部の例外は"システム。ObjectDisposedException"スローされ(ほぼ)のfinaliserを閉じる際のソケット!他にはありませんを参考に、ソケットを通圏及び処分が保護されるソケットクラスなんかそうでないオブジェクトが廃棄することができます
さらに、私はなく吸収しObjectDisposedExceptionルが終了するのは、ひとつでぶつかることから、ラインのリスナーのねじになります。
だけでなくどのようにソケット処理の前にした。
自分の知識のソケットはナからこの問題でわからない場合はうまいが必要かもしれません。LMKればなります!●
public class Foo
{
private Socket sock = null;
private Thread tListenerThread = null
private bool bInitialised;
private Object InitLock = null;
private Object DeInitLock = null;
public Foo()
{
bInitialised = false;
InitLock = new Object();
DeInitLock = new Object();
}
public bool initialise()
{
if (null == InitLock)
return false;
lock (InitLock)
{
if (bInitialised)
return false;
sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 8);
sock.Bind( /*localIpEndPoint*/);
sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(mcIP));
tListenerThread = new Thread(new ThreadStart(listener));
tListenerThread.Start();
bInitialised = true;
return true;
}
}
~Foo()
{
if (bInitialised)
deInitialise();
}
private void deInitialise()
{
if (null == DeInitLock)
return;
lock (DeInitLock)
{
if (bInitialised)
{
sock.Shutdown(SocketShutdown.Both); //throws System.ObjectDisposedException
sock.Close();
tListenerThread.Abort(); //terminates xunit test!
tListenerThread = null;
sock = null;
bInitialised = false;
}
}
}
}
解決
このオブジェクトがガベージコレクションの対象とはないその他の参考文献のソケットの ソケットの finalizerが探しも、予約も、支払も前のオブジェクトのfinalizer.疑いがどのような挙動となるでしょうか。
一般的に、悪いこと(IMO)にいており、これからも多く、finalizer.どうかよろしくお願いします最後に行finalizer全を実装する場合IDisposableすることになります 直接 参考文献を管理対象外に資源がほとんどのIntPtrs.整然停止すべき規範をfinalizerは通常走行されるプログラム、シャットダウン、または人が忘れられた処理インスタンス。
(さんに明らかにしたので、日本にはコードになった理由で問題がある。謝罪すでに知っていた一部/全るようになりました。)
他のヒント
方法によっては、ガベージコレクタとfinalizers、finalizersのみでお使いのクラスは、 直接 オーナーのポリシー資源などのウィンドウハンドルは、GDIオブジェクトは、グローバル対応またはその他の種類のIntPtr.
A finalizerないよう処理にも使用管理対象のリソースやリスクに電話をかける確定または廃棄オブジェクトです。
私のおすすめす 非常に重要Microsoft第 詳しいごみ収集作品。また、このMSDNは参考となる の実施を決定及び処分にポリシー資源の, は、厳のために提言を行います。
このように:
- 場合はオブジェクトが保持するポリシー資源、実施するべきであるIDisposableなければなりませんの実施Finalizer.
- 場合はオブジェクトが保持するIDiposableオブジェクトでも実装IDisposableで、処分そのオブジェクトを明確にした。
- 場合はオブジェクトでは両方のポリシーは、使い捨てのfinalizer呼び名を付けなければな二diferent版の処理、リリース使い捨て、ポリシーのみでポリシー.これは通常より処理(bool)から呼び出される関数をDipose()およびFinalizer().
- のFinalizerなければならな利用その他の資源のポリシーときと同じものが割り当てられ公開されます。カスタマイズできますリスクを参照収集した廃棄物は、以下のオブジェクトは一時的にressurected前のファイナライズ.
新しい情報:このように見えん問題が実際に、そのスレッド一 が表示され すると有害.
らにMSDN上記リンク:
"ThreadAbortException特別 例外で獲れるもので 自動的に引き上げ再び 最catchブロックです。"
一部の非常に興味深い地域のコンテンツもそのリンクを含む "ねじになります。Abortはログインが必要で未設計プログラム".
なので少しているのか教えてください胸を張って投稿を続にこの変更現在:)