成千上万的异步任务,等待task.delay()问题

时间:2015-05-29 09:20:05

标签: .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()
    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

有什么想法吗?

0 个答案:

没有答案