C# 具有超时的Task.WhenAny等待的时间超过超时值

C# 具有超时的Task.WhenAny等待的时间超过超时值,c#,async-await,C#,Async Await,我有一段代码: var client = new TcpClient(); HttpRequestInfo.AddTimestamp("Connecting"); await Task.WhenAny(client.ConnectAsync(serverAddress, serverPort), Task.Delay(TimeSpan.FromMilliseconds(300))); HttpRequestInfo.AddTimestamp("Connect

我有一段代码:

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
我假设这种方法将给我机会通过超时(300ms)来限制连接。然而,我看到这行代码有时(很少)运行时间超过300毫秒。 这种行为的原因是什么?

状态:

此方法取决于系统时钟。这意味着 延迟大约等于系统时钟的分辨率,如果 延迟参数小于系统时钟的分辨率, 在Windows系统上大约为15毫秒

因此,如果超时时间比300毫秒长约15毫秒,它可以解释超时时间更长的原因,因为延迟必须根据系统时钟分辨率自行调整

这并不能解释更大范围内更长的超时时间。
我假设由于某种原因,
ConnectAsync
可能会在返回调用方法之前阻塞一段时间,如果是真的,则从您的第一次日志到您实际启动
任务之间需要一段时间。延迟
,而问题与延迟根本无关

您可以尝试此代码并监视日志,启动
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");
}

在这种情况下,据我所知,延迟可能约为285-315毫秒。但在我的情况下,该方法的执行时间约为3015毫秒(例如3053-38)。谢谢!我将尝试用这种方式制作时间戳。然而,在我看来,结果并没有改变。