【发布时间】:2017-05-26 00:25:44
【问题描述】:
我有一个包含 10 个任务的列表,每个任务需要 15 秒。所有任务都在一个数组中并且异步执行。整个集合不应该花费大约 15 秒吗?从下面的代码中,请注意在输出中整个集合需要 21 秒。当我将其更改为 100 个任务时,需要一分钟多的时间。就好像简单地创建任务需要一秒钟。我错过了什么?谢谢!
static void Main(string[] args)
{
var mainStart = DateTime.Now;
var tasks = new List<Task>();
for (int i = 0; i < 10; i++)
{
tasks.Add(Task.Factory.StartNew((Object data) =>
{
var index = (int)data;
var stepStart = DateTime.Now;
Console.WriteLine("{0} Starting {1} on thread {2}...", stepStart, index, Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(15000);
var stepFinish = DateTime.Now;
Console.WriteLine("{0} Finished {1} on thread {2}, duration: {3}",
stepStart, index, Thread.CurrentThread.ManagedThreadId, stepFinish - stepStart);
},
i));
}
Task.WaitAll(tasks.ToArray());
var mainFinish = DateTime.Now;
Console.WriteLine("{0} Finished, duration {1}", DateTime.Now, mainFinish - mainStart);
Console.WriteLine("Press any key to exit.");
Console.Read();
// Output
//5/25/2017 8:03:43 PM Starting 0 on thread 10...
//5/25/2017 8:03:43 PM Starting 1 on thread 11...
//5/25/2017 8:03:43 PM Starting 2 on thread 12...
//5/25/2017 8:03:43 PM Starting 3 on thread 13...
//5/25/2017 8:03:44 PM Starting 4 on thread 14...
//5/25/2017 8:03:45 PM Starting 5 on thread 15...
//5/25/2017 8:03:46 PM Starting 6 on thread 16...
//5/25/2017 8:03:47 PM Starting 7 on thread 17...
//5/25/2017 8:03:48 PM Starting 8 on thread 18...
//5/25/2017 8:03:49 PM Starting 9 on thread 19...
//5/25/2017 8:03:43 PM Finished 0 on thread 10, duration: 00:00:15.0018957
//5/25/2017 8:03:43 PM Finished 1 on thread 11, duration: 00:00:15.0175209
//5/25/2017 8:03:43 PM Finished 2 on thread 12, duration: 00:00:15.0175209
//5/25/2017 8:03:43 PM Finished 3 on thread 13, duration: 00:00:15.0165291
//5/25/2017 8:03:44 PM Finished 4 on thread 14, duration: 00:00:15.0156567
//5/25/2017 8:03:45 PM Finished 5 on thread 15, duration: 00:00:15.0156012
//5/25/2017 8:03:46 PM Finished 6 on thread 16, duration: 00:00:15.0155997
//5/25/2017 8:03:47 PM Finished 7 on thread 17, duration: 00:00:15.0155989
//5/25/2017 8:03:48 PM Finished 8 on thread 18, duration: 00:00:15.0155985
//5/25/2017 8:03:49 PM Finished 9 on thread 19, duration: 00:00:15.0156328
//5/25/2017 8:04:04 PM Finished, duration 00:00:21.0322775
//Press any key to exit.
}
【问题讨论】:
-
谢谢@Clay 和@Guilherme!两个答案都很棒,每个都可以根据情况细节使用。我将两者标记为答案和有用,不知道在这个论坛中会如何对待它们。
标签: c# multithreading asynchronous task