虽然试图找出新的(可能不是现在这么新,但对我来说是新手)Task
在C#中的异步编程,我遇到了一个问题,让我花了一些时间弄清楚,我不知道为什么。Task.WaitAll不等待任务完成
我已经解决了这个问题,但我仍然不确定为什么它是一个问题开始。我只是想我会分享我的经验,以防万一有人遇到同样的情况。
如果任何大师想告诉我问题的原因,这将是美好的,非常感激。我总是喜欢只知道为什么东西不起作用!
我做了一个测试任务,如下所示:
Random rng = new Random((int)DateTime.UtcNow.Ticks);
int delay = rng.Next(1500, 15000);
Task<Task<object>> testTask = Task.Factory.StartNew<Task<object>>(
async (obj) =>
{
DateTime startTime = DateTime.Now;
Console.WriteLine("{0} - Starting test task with delay of {1}ms.", DateTime.Now.ToString("h:mm:ss.ffff"), (int)obj);
await Task.Delay((int)obj);
Console.WriteLine("{0} - Test task finished after {1}ms.", DateTime.Now.ToString("h:mm:ss.ffff"), (DateTime.Now - startTime).TotalMilliseconds);
return obj;
},
delay
);
Task<Task<object>>[] tasks = new Task<Task<object>>[] { testTask };
Task.WaitAll(tasks);
Console.WriteLine("{0} - Finished waiting.", DateTime.Now.ToString("h:mm:ss.ffff"));
// make console stay open till user presses enter
Console.ReadLine();
然后我跑的应用程序,看看它吐出来。以下是一些示例输出:
6:06:15.5661 - 延迟3053ms开始测试任务。
6:06:15.5662 - 已完成等待。
6:06:18.5743 - 3063.235ms后完成测试任务。
正如你所看到的,Task.WaitAll(tasks);
声明并没有太多的作用。在继续执行之前,它总共等待1毫秒。
我已经在下面回答了我自己的“问题” - 但正如我上面所说的 - 如果有人比我更懂得解释为什么这不起作用,请做! (I 认为它可能与该方法的执行“跳出”有关,一旦它达到了await
操作员 - 然后一旦等待完成后又退回......但我可能是错的)
为什么要那样做'新的随机((int)的DateTime.UtcNow.Ticks)'?为什么不只是'新的Random()',因为它实际上是同一件事情。 – Enigmativity
不是说这个问题对于这个问题是重要的或者相关的,而是纯粹为了看看它做了什么,如果有的话。我没有注意到与调用无参数构造函数有什么不同,所以我从现在开始就这样做。 如果你不尝试新的东西,你不会学到任何东西。编程对我来说是一种爱好,除了Karel Robot,Pascal和SQL之外,我还没有接受过任何正式的教育,而这已经是13年以前的事了,所以对我来说修改,尝试,破坏事物,图他们出去学习。 – cjk84
你最好下载一个免费的.NET反编译器并查看源代码。 – Enigmativity