我有一个Windows服务应用程序,它大量使用.Net任务。我对他们有一个很好的理解,但我不是亲,我遇到了问题。
我的情况是await Task.Delay()
有时需要更长时间(最多60秒)。我确定这是由于我正在做的事情,但我无法追查可能影响这一点的事情。
这是我正在做的事情类型的一个简化的人为例子。
public async Task DoDelay(CancellationToken token = default(CancellationToken))
{
// Delay for then check to see if we need to extend our visibility timeout
DateTime beforeDelay = DateTime.Now;
// Wait for 180 seconds, i.e. 3 minutes
await Task.Delay((int)180 * 1000, token).ConfigureAwait(false);
// Check to see how long we actually delayed for
TimeSpan durationOfDelay = DateTime.Now - beforeDelay;
Trace.WriteLine("Duration: " + durationOfDelay.TotalSeconds.ToString());
}
有时durationOfDelay
的延迟时间比我延迟的时间长60秒。
作为一些背景知识,可能有多个其他任务调用DoDelay()
并同时运行。我已经看到,有时候所有等待的Task.Delay()
电话都在同一时间完成,尽管在不同时间等待同一延迟值。
例如:
// Non-awaited call executed at 00:00
DoDelay();
// Non-awaited call executed at 00:10
DoDelay();
// Non-awaited call executed at 00:20
DoDelay();
// Time goes by....
// Trace output:
// "Duration: 200"
// "Duration: 190"
// "Duration: 180"
什么会导致这类事情?