再会。我和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手动读取停止后,当我打电话时 …