关闭后我还应该打电话Dispose()给我的插座吗?
例如:
mySocket.Shutdown(SocketShutdown.Both);
mySocket.Close();
mySocket.Dispose(); // Redundant?
Run Code Online (Sandbox Code Playgroud)
我想知道因为MSDN文档说明如下:
关闭Socket连接并释放所有相关资源.
我有一台服务器接收来自客户端的连接请求.该服务器使用异步Socket.BeginReceive和Socket.EndReceive方法.代码与此处的代码非常相似.
在我的情况下,在调用之后Socket.BeginReceive我需要一个超时,这样如果客户端挂起连接但是在一段固定的时间内根本不传输任何数据,我需要终止连接.
再会。我和UdpClient它一起工作并有包装。
为了阅读,我有异步方法:
\n\nprivate async Task<byte[]> Receive(UdpClient client, CancellationToken breakToken)\n{\n // \xd0\x92\xd1\x8b\xd1\x85\xd0\xbe\xd0\xb4 \xd0\xb8\xd0\xb7 async, \xd0\xb5\xd1\x81\xd0\xbb\xd0\xb8 \xd0\xbf\xd1\x80\xd0\xbe\xd0\xb8\xd0\xb7\xd0\xbe\xd1\x88\xd1\x91\xd0\xbb CancellationRequest\n breakToken.ThrowIfCancellationRequested();\n\n UdpReceiveResult result;\n try\n {\n result = await client.ReceiveAsync().WithCancellation(breakToken);\n }\n catch(OperationCanceledException)\n {\n // \xd0\xa8\xd1\x82\xd0\xb0\xd1\x82\xd0\xbd\xd0\xb0\xd1\x8f \xd1\x81\xd0\xb8\xd1\x82\xd1\x83\xd0\xb0\xd1\x86\xd0\xb8\xd1\x8f \xd1\x80\xd1\x83\xd1\x87\xd0\xbd\xd0\xbe\xd0\xb9 \xd0\xbe\xd1\x81\xd1\x82\xd0\xb0\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xba\xd0\xb8 Task-\xd0\xb0\n }\n\n return result.Buffer;\n}\nRun Code Online (Sandbox Code Playgroud)\n\nWithCancellation我提前终止的扩展方法在哪里:
public static async Task<T> WithCancellation<T>(\n this Task<T> task, CancellationToken cancellationToken)\n{\n var tcs = new TaskCompletionSource<bool>();\n\n using (cancellationToken.Register(\n s => ((TaskCompletionSource<bool>)s).TrySetResult(true),\n tcs))\n if (task != await Task.WhenAny(task, tcs.Task))\n throw new OperationCanceledException(cancellationToken);\n\n return await task;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n手动读取停止后,当我打电话时 …