当使用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秒。如果需要的话,我会发布整个代码示例,但是用我现在发布的内容应该很容易重新创建。