gpt4 book ai didi

c# - Task.WhenAny 超时等待超过超时值

转载 作者:太空狗 更新时间:2023-10-30 01:29:58 26 4
gpt4 key购买 nike

我有这段代码:

var client = new TcpClient();
HttpRequestInfo.AddTimestamp("Connecting");
await Task.WhenAny(client.ConnectAsync(serverAddress, serverPort),
Task.Delay(TimeSpan.FromMilliseconds(300)));
HttpRequestInfo.AddTimestamp("Connected");
if(client.Connected){ ... }

其中 HttpRequestInfo.AddTimestamp 只是使用 Stopwatch 类记录命名时间戳。

我有时在日志中看到:

"Connecting":110ms - "Connected":747ms
"Connecting":35ms - "Connected":3120ms
"Connecting":38ms - "Connected":3053ms

我认为这种方法会让我有机会通过超时(300 毫秒)限制连接。但是,我看到这行代码有时(很少)运行时间超过 300 毫秒。这种行为的原因是什么?

最佳答案

docs状态:

This method depends on the system clock. This means that the time delay will approximately equal the resolution of the system clock if the delay argument is less than the resolution of the system clock, which is approximately 15 milliseconds on Windows systems.

因此,如果超时大约比 300 毫秒多 15 毫秒,则可以解释超时时间较长,因为延迟必须自行调整以适应系统时钟分辨率。

这并不能解释你的超时时间越长,规模越大。
我假设由于某种原因 ConnectAsync 可能会在返回调用方法之前阻塞一段时间,如果这是真的,那么在你的第一个日志和你实际触发 Task.Delay< 之间需要时间 并且问题与延迟完全无关。

您可以尝试此代码并监控日志,也许在启动 ConnectAsync 时隐藏了丢失的时间:

var client = new TcpClient();
HttpRequestInfo.AddTimestamp("Launching ConnectAsync");
var connectAsyncTask = client.ConnectAsync(serverAddress, serverPort);
HttpRequestInfo.AddTimestamp("ConnectAsync launched");
HttpRequestInfo.AddTimestamp("Launching Delay");
var delayTask= Task.Delay(TimeSpan.FromMilliseconds(300));
HttpRequestInfo.AddTimestamp("Delay launched");
var firstTask = await Task.WhenAny(connectAsyncTask, delayTask);
if(firstTask == connectAsyncTask)
{
HttpRequestInfo.AddTimestamp("Connected");
}
else
{
HttpRequestInfo.AddTimestamp("Timeout");
}

关于c# - Task.WhenAny 超时等待超过超时值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48415473/

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