我是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;
}
}
}
}
}
超时后失败是不错的算法?如果没有,我怎么能改进它?
答案 0 :(得分:3)
传播应取消操作的通知。
建议的方法是将其传递给ConnectToDataServer
方法:
private void SetupConnection()
{
CancellationTokenSource cancellation = new CancellationTokenSource();
cancellation.CancelAfter(TimeSpan.FromSeconds(5));
ConnectToDataServer(cancellation.Token);
}
如果达到超时,将抛出OperationCanceledException。
你的ConnectToDataServer
应继续传递参数,直到你可以适当地处理取消。
如果您在内部使用第三方库,则API应该有一个接受CancellationToken
的方法重载。
然后,您最好的选择是围绕Task
:
private void SetupConnection()
{
CancellationTokenSource cancellation = new CancellationTokenSource();
cancellation.CancelAfter(TimeSpan.FromSeconds(5));
Task.Run(() => ConnectToDataServer(), cancellation.Token).GetAwaiter().GetResult();
}