我正在为一个打开套接字,发出请求并监听响应的类使用一些代码(不是我的,我急于添加,我一点也不信任),它以我可以的方式抛出异常在 xunit 中测试时不理解。我假设同样的异常发生在“现场”,但是该类被一个单例引用,所以它可能只是被隐藏了。
问题在 xunit 中表现为“System.CannotUnloadAppDomainException: Error while unloading appdomain”,内部异常是在关闭套接字时(基本上)在终结器内抛出“System.ObjectDisposedException”!没有其他对调用 close 和 dispose 的套接字的引用在 Socket 类上受到保护,所以我不清楚如何处理该对象。
此外,如果我只是捕获并吸收 ObjectDisposedException,xunit 会在它到达关闭侦听器线程的行时终止。
我只是不明白在要求关闭之前如何处理 Socket。
我对套接字的了解只是我发现这个问题后学到的知识,所以我不知道我是否提供了 SO 可能需要的一切。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;
}
}
}
}