我使用循环来启动~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
我正在创建一系列任务,这些任务应该从某些来源异步下载数据。
现在,问题。虽然我仍然有少量任务,但一切正常。当我开始获得更多任务时,我会定期得到正在睡觉的任务的时刻(等待task.delay(1000)),只是按时停止醒来。几秒钟(2-3秒)不会唤醒任何单个任务。看起来他们只是被冻结了。然后他们突然在一次巨大的爆发中醒来。
我测量每个任务睡觉的时间,从中减去1000(预期的睡眠时间),我得到睡眠的“偏差”,通常是~15ms。一旦任务醒来,我就把它放到控制台上:
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
此循环每隔~10秒定期重复一次。 这是一些图像。 正常:http://i.imgur.com/ZeMa05r.png 一阵迟到的任务醒来:http://i.imgur.com/mv0X513.png
有什么想法吗?