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

时间:2016-10-11 14:20:54

标签: c# algorithm

我是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;
                }
            }
        }
    }
}

超时后失败是不错的算法?如果没有,我怎么能改进它?

1 个答案:

答案 0 :(得分:3)

使用CancellationToken

  

传播应取消操作的通知。

建议的方法是将其传递给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();
}