负载下的HttpClient忽略超时

时间:2018-09-11 16:04:37

标签: c# http asynchronous get dotnet-httpclient

当使用HttpClient时(与同一客户端相同,或者为每个请求创建一个新客户端,或者甚至为每个x请求创建一个新客户端),GetStringAsync超时时间会根据客户端的负载而增加。这是示例代码。

public class AsyncTester
{
    private readonly Dictionary<int, HttpClient> _httpClients = new Dictionary<int, HttpClient>();
    public async void Test()
    {
        await WaitForTimeout(2);
    }

    public async Task WaitForTimeout(int seconds)
    {
        var client = GetClientWithTimeout(seconds); 
        var sw = new Stopwatch();
        try
        {
            sw.Start();
            var res = await client.GetStringAsync("https://19.38.249.96/?format=json"); //or any URL that will timeout
            sw.Stop();
        }
        catch (Exception)
        {
            if (sw.IsRunning)
            {
                sw.Stop();
            }
        }
        Console.WriteLine(sw.Elapsed.TotalMilliseconds);
    }

    private HttpClient GetClientWithTimeout(int timeoutSeconds)
    {
        if (_httpClients.ContainsKey(timeoutSeconds))
        {
            return _httpClients[timeoutSeconds];
        }
        else
        {
            var client = new HttpClient(new HttpClientHandler()) { Timeout = TimeSpan.FromSeconds(timeoutSeconds) };
            _httpClients.Add(timeoutSeconds, client);
            return client;
        }
    }
}

现在,让我们来一个像这样的课程。如果我们在无尽的while循环中调用Test(),然后在其中睡眠Thread.Sleep(10)毫秒,就会开始乐趣。第一个请求的OK超时约为2秒,但是接下来的所有请求都是2秒以上,甚至在一段时间后达到10秒以上。

现在,我希望我做错了,因为我需要一个可以依靠的超时异常,并且我需要大致准确地说,我可以忍受50%的错误,但是500%的错误却有点傻。 / p>

请记住,(在我的开发PC上)当您使用更长的睡眠时间Thread.Sleep(70)时,我想要的时间将近2秒。另外,如果我们说Thread.Sleep(200),则几乎是2秒。如果需要的话,我会发布整个代码示例,但是用我现在发布的内容应该很容易重新创建。

0 个答案:

没有答案