gpt4 book ai didi

c# - 异步网络操作永远不会完成

转载 作者:太空狗 更新时间:2023-10-29 21:13:01 24 4
gpt4 key购买 nike

我有几个异步网络操作返回一个可能永远不会完成的任务:

  1. UdpClient.ReceiveAsync 不接受 CancellationToken
  2. TcpClient.GetStream 返回一个 NetworkStream,它不遵守 Stream.ReadAsync 上的 CancellationToken(检查仅在操作开始时取消)

两者都在等待一条可能永远不会到来的消息(例如因为数据包丢失或没有响应)。这意味着我有永远不会完成的 幻影 任务,永远不会运行的延续和使用的套接字暂停。我知道我可以使用 TimeoutAfter ,但这只会解决延续问题。

那我该怎么办呢?

最佳答案

所以我在 IDisposable 上创建了一个扩展方法,它创建了一个 CancellationToken,它在超时时处理连接,因此任务完成,一切继续进行:

public static IDisposable CreateTimeoutScope(this IDisposable disposable, TimeSpan timeSpan)
{
var cancellationTokenSource = new CancellationTokenSource(timeSpan);
var cancellationTokenRegistration = cancellationTokenSource.Token.Register(disposable.Dispose);
return new DisposableScope(
() =>
{
cancellationTokenRegistration.Dispose();
cancellationTokenSource.Dispose();
disposable.Dispose();
});
}

而且用法非常简单:

try
{
var client = new UdpClient();
using (client.CreateTimeoutScope(TimeSpan.FromSeconds(2)))
{
var result = await client.ReceiveAsync();
// Handle result
}
}
catch (ObjectDisposedException)
{
return null;
}

额外信息:

public sealed class DisposableScope : IDisposable
{
private readonly Action _closeScopeAction;
public DisposableScope(Action closeScopeAction)
{
_closeScopeAction = closeScopeAction;
}
public void Dispose()
{
_closeScopeAction();
}
}

关于c# - 异步网络操作永远不会完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21468137/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com