.net 数千个异步任务,等待任务。延迟()问题

.net 数千个异步任务,等待任务。延迟()问题,.net,vb.net,multithreading,asynchronous,.net,Vb.net,Multithreading,Asynchronous,我使用循环启动约1000-2000个任务,通常速度约为每秒1个任务。要创建任务,我只需执行以下操作: For i = 0 to 2000 Task.run( Async Function() Await RunHttpLoop() End Function) await task.delay(1000) Next 现在,RunHttpLoop()看起来像这样: Async Function RunHttpLoop()

我使用循环启动约1000-2000个任务,通常速度约为每秒1个任务。要创建任务,我只需执行以下操作:

For i = 0 to 2000
    Task.run(
        Async Function()
            Await RunHttpLoop()
        End Function)
    await task.delay(1000)
Next
现在,RunHttpLoop()看起来像这样:

Async Function RunHttpLoop()
    dim response = Await webclient.DownloadDataTaskAsync(someuri)
    if response.contains("finished") then return

    dim startsleep = datetime.now
    await task.delay(1000)

    'Measure how much longer than 1000ms each task slept
    console.writeline((startsleep - datetime.now).duration.totalmilliseconds - 1000)) 
End Function
我正在创建一组任务,这些任务应该是从一些源异步下载数据

现在,问题来了。虽然我还有少量任务,但一切都很顺利。当我开始做更多的任务时,我会周期性地发现那些正在睡觉的任务(wait task.delay(1000))不再按时醒来。在几秒钟(2-3秒钟)内,没有一个任务会被唤醒。看起来他们就像被冻住了一样。然后突然,他们都在一个巨大的爆炸中醒来

我测量每个任务的睡眠时间,从中减去1000(预期睡眠时间),得到睡眠的“偏差”,通常为15毫秒。任务一醒来,我就把它放到控制台上:

Task sleep deviation from 1000ms:
0
15
13
12
5
15
14
3
9
5
8
51
22
11
15 <----Freezes here for ~2-3 seconds


...Nothing...


1000 <---GIANT burst of delayed tasks comes rushing out
2000
500
600
900
1200
1500 
1200
900
1200
1500
1200
600
900
1200
1500 
1200
900
1200
1500
1200
15 <-----Back to normal.
10
6
11
7
15
10
6
11
7
...etc
任务睡眠与1000ms的偏差:
0
15
13
12
5.
15
14
3.
9
5.
8.
51
22
11

15创建任务时,您可能应该查看
任务创建选项。这将从调度程序中释放它们(以生成更多线程为代价)。调用wait后发生的事情将在任务完成运行后的某个未指定且不确定的时间发生。你不应该认为这是立即发生的。这是编程模型的一部分。当你使用async时,你基本上是说你不在乎它什么时候运行,或者在什么线程上运行,只要它开始得不太早。非常好的问题,谢谢你提供有用的数据!1000ms的延迟当然是意外的,而不是由于操作系统的调度决定。延迟突发发生后,应用程序进程中有多少线程?这个盒子有多少内存?我在考虑定时器合并。我无法想象它会造成这样的延迟,但让我们检查一下。服务器的电源计划是什么?如果将其置于高性能模式,问题是否会消失?这是一个非常弱的预感…请发布一个最低限度的修改。我想知道这是否与HTTP节流(请求和/或服务器端)有关,因为我无法使用重新编程。