我正在测试async / await,这是问题所在。我异步启动两个任务并等待执行完成。我希望这两个任务等待各自的延迟,然后返回打印总的毫秒数。但该程序仅打印1 start " + current time
和2 start " + current time
,但之后没有任何内容。如何从延迟的任务返回并打印最终结果?
static void Main(string[] args)
{
RunTasksWithDelays();
}
static async void RunTasksWithDelays()
{
Stopwatch s = Stopwatch.StartNew();
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
Task task1 = LongRunningTask1();
Task task2 = LongRunningTask2();
await Task.WhenAll(task1, task2);
Console.WriteLine("total milliseconds elapsed: " + s.ElapsedMilliseconds / 1000);
}
static async Task LongRunningTask1()
{
Console.WriteLine("1 start " + DateTime.Now);
await Task.Delay(5000);
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("1 end " + DateTime.Now);
}
static async Task LongRunningTask2()
{
Console.WriteLine("2 start " + DateTime.Now);
await Task.Delay(2000);
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("2 end " + DateTime.Now);
}
答案 0 :(得分:4)
您的主线程结束,因此程序结束,因为您的应用程序中没有前台线程来保持程序存活。
理想情况下,您应该等待RunTasksWithDelays
方法,但出于两个原因,您无法等待它
Task
Main
方法不支持await
。您应该使RunTasksWithDelays方法返回async Task
而不是async void
,您应该等待它完成。同步等待是一个坏主意,在这种情况下这很好,因为我们没有任何选择。
static void Main(string[] args)
{
RunTasksWithDelays().Wait();
}
static async Task RunTasksWithDelays()
{
...
}
答案 1 :(得分:2)
您的方法RunTasksWithDelays
应该返回一个任务,让调用者等待此任务完成。
然后您只需拨打RunTasksWithDelays().Wait();