gpt4 book ai didi

c# - 超时后失败的最佳方法是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:43:08 25 4
gpt4 key购买 nike

我是 C# 的新手,我想创建一个算法,该算法将在某个超时值后停止连接。

private void SetupConnection()
{
var stopwatch = new Stopwatch();
stopwatch.Start();

while (true)
{
try
{
ConnectToDataServer();
break;
}
catch (SocketException)
{
if (stopwatch.Elapsed < _request.TransferTimeout)
{
Thread.Sleep(TimeSpan.FromSeconds(5));
}
else
{
_request.TransferTimeout = new TimeSpan();
throw;
}
}
}
}
}

超时后失败是好的算法吗?如果没有,我该如何改进?

最佳答案

使用 CancellationToken :

Propagates notification that operations should be canceled.

推荐的方法是将它传递给您的 ConnectToDataServer 方法:

private void SetupConnection()
{
CancellationTokenSource cancellation = new CancellationTokenSource();
cancellation.CancelAfter(TimeSpan.FromSeconds(5));
ConnectToDataServer(cancellation.Token);
}

OperationCanceledException如果达到超时将被抛出。

您的 ConnectToDataServer 应该继续传递参数,直到您可以适本地处理取消。

如果您在内部使用第三方库,API 应该有一个方法重载来接受 CancellationToken


如果无法更改 ConnectToDataServer 方法

然后你最好的选择是围绕一个Task来结束你的调用:

private void SetupConnection()
{
CancellationTokenSource cancellation = new CancellationTokenSource();
cancellation.CancelAfter(TimeSpan.FromSeconds(5));
Task.Run(() => ConnectToDataServer(), cancellation.Token).GetAwaiter().GetResult();
}

关于c# - 超时后失败的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39979439/

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