Q&A 20090810

Q:
端口转接器的问题1:
网元:ERICSSONOSS 接收数据时发生异常
System.Net.Sockets.SocketException: 一个封锁操作被对 WSACancelBlockingCall 的调用中断。
   在 System.Net.Sockets.Socket.Send(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
   在 System.Net.Sockets.Socket.Send(Byte[] buffer)
   在 Ultr.ActiveMonitor.SocketConvernationLib.NeVirtualPortTelnetSession.EndReceiveNeSocket(IAsyncResult ir)

有关更多信息,请参阅在 http://go.microsoft.com/fwlink/events.asp 的帮助和支持中心。
端口转接器的问题2:
System.ObjectDisposedException: 无法访问已释放的对象。
对象名:“System.Net.Sockets.Socket”。
   在 System.Net.Sockets.Socket.Shutdown(SocketShutdown how)
   在 Ultr.ActiveMonitor.SocketConvernationLib.NeVirtualPortListener.SocketSession_Received(Object sender, DataReceivedEventArgs e)
A:
这个其实是在建立连接以后, 没有测试连接就直接使用, 有时候底层socket并没有完全准备好, 就会报告这个这个异常
.net的apidemo里面是这么写的

// .Connect throws an exception if unsuccessful
client.Connect(anEndPoint);

// This is how you can determine whether a socket is still connected.
bool blockingState = client.Blocking;
try
{
    byte [] tmp = new byte[1];

    client.Blocking = false;
    client.Send(tmp, 0, 0);
    Console.WriteLine("Connected!");
}
catch (SocketException e) 
{
    // 10035 == WSAEWOULDBLOCK
    if (e.NativeErrorCode.Equals(10035))
        Console.WriteLine("Still Connected, but the Send would block");
    else
    {
        Console.WriteLine("Disconnected: error code {0}!", e.NativeErrorCode);
    }
}
finally
{
    client.Blocking = blockingState;
}


Q:
如果在一个主线程内起了一个工作线程去连接网元, 在连接建立起来以后, 主线程调用工作线程的abort方法强制结束工作线程, 工作线程内部的Socket句柄会不会释放, 非托管会不会被释放(文件句柄, IO句柄,数据库连接)?
A:
不会,因为这些资源的句柄是存储在进程的句柄表的,所以在进程结束以前, 这些资源很难被释放掉(.net的自动回收机制理论上可以回收掉, 但是仅仅存在在理论上, 实际写服务器端代码的时候, 是无法依赖.net的自动回收的, 因为.net的自动回收的时机是不确定的, 很有可能在资源耗尽以后再开始进行回收 ,但是那个时候, 系统已经开始停止服务了, 这种情况是不允许出现的)

Q:
一个对象的事件有注册的事件响应函数,那么这个对象不再有用以后, 如果注册的事件响应函数没有取消注册,那么这个对象是不是可以被回收释放。
A:
不会,这个是由于事件本质上是使用函数指针来做的.
 

原文地址:https://www.cnblogs.com/dunnice/p/1542695.html