版本1.6.6.1,运行了一两年的机台出实现了:调用SuperSocket.SocketEngine.AsyncSocketSession.OnSendingCompleted时出现System.ArgumentNullException: 值不能为 null。
异常日志:
2025/01/04 17:59:37.282 ERROR
System.ArgumentNullException: 值不能为 null。
参数名: source
在 System.Linq.Enumerable.Select[TSource,TResult](IEnumerable1 source, Func2 selector)
在 System.Linq.Enumerable.Sum[TSource](IEnumerable1 source, Func2 selector)
在 SuperSocket.SocketEngine.AsyncSocketSession.OnSendingCompleted(Object sender, SocketAsyncEventArgs e)
在 System.Net.Sockets.SocketAsyncEventArgs.OnCompleted(SocketAsyncEventArgs e)
在 System.Net.Sockets.SocketAsyncEventArgs.ExecutionCallback(Object ignored)
在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
在 System.Net.Sockets.SocketAsyncEventArgs.FinishOperationSuccess(SocketError socketError, Int32 bytesTransferred, SocketFlags flags)
在 System.Net.Sockets.SocketAsyncEventArgs.CompletionPortCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
在 System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)
2025/01/04 17:59:37.331 ERROR
System.InvalidOperationException: "现在已经正在使用此 SocketAsyncEventArgs 实例进行异步套接字操作。
在 System.Net.Sockets.SocketAsyncEventArgs.StartConfiguring()
在 System.Net.Sockets.SocketAsyncEventArgs.SetBufferInternal(Byte[] buffer, Int32 offset, Int32 count)
在 System.Net.Sockets.SocketAsyncEventArgs.SetBuffer(Byte[] buffer, Int32 offset, Int32 count)
在 SuperSocket.SocketEngine.AsyncSocketSession.ClearPrevSendState(SocketAsyncEventArgs e)
在 SuperSocket.SocketEngine.AsyncSocketSession.OnSendingCompleted(Object sender, SocketAsyncEventArgs e)
在 System.Net.Sockets.SocketAsyncEventArgs.OnCompleted(SocketAsyncEventArgs e)
在 System.Net.Sockets.SocketAsyncEventArgs.ExecutionCallback(Object ignored)
在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
在 System.Net.Sockets.SocketAsyncEventArgs.FinishOperationSuccess(SocketError socketError, Int32 bytesTransferred, SocketFlags flags)
在 System.Net.Sockets.SocketAsyncEventArgs.CompletionPortCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
在 System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)
对于该问题我快速看了代码,没有找到具体原因,有以下几个方向的猜测:
- 是否SendQueue在被访问的时候被其他线程赋值为null?
- 是否有可能是多线程访问的问题导致了queue引用异常?
- 能否在OnSendingCompleted中加入对queue的非空验证?因为这时候已经是发送结束的收尾阶段,异常后记录警告级别的日志。
其他信息: server config:除了端口号和IP外其他都是默认。 程序会异步调用AppSession<TAppSession>.Send(string message)
感谢支持。
建议升级到SuperSocket 2.0. 1.6版本不再维护了。