相关疑难解决方法(0)

UdpClient.ReceiveAsync 正确提前终止

再会。我和UdpClient它一起工作并有包装。

\n\n

为了阅读,我有异步方法:

\n\n
private 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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

WithCancellation我提前终止的扩展方法在哪里:

\n\n
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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

手动读取停止后,当我打电话时 …

c# asynchronous udpclient objectdisposedexception

3
推荐指数
1
解决办法
8373
查看次数