在尝试理解 C# 中新的(也许现在并不那么新了,但对我来说是新的)异步编程 Task
时,我遇到了一个问题,花了我一些时间才解决,但我不确定为什么会出现这个问题。
我已经解决了这个问题,但仍然不确定为什么它一开始成为了问题。只是想分享我的经验,以防万一有人遇到相同的情况。
如果任何大师能告诉我问题的原因,那将非常棒并且非常感激。我总是喜欢知道为什么某件事情不起作用!
我创建了一个测试任务,如下所示:
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毫秒。
我在下面回答了自己的“问题”-但是像我说的那样,如果有比我更有知识的人能解释为什么这不起作用,请这样做!
(我认为可能与执行到达await
操作符时执行“步出”方法,然后在等待完成后再次“步入”方法有关...但我可能是错的)
new Random((int)DateTime.UtcNow.Ticks)
?为什么不直接使用new Random()
,因为它们本质上是相同的。 - Enigmativity