我正在运行以下代码:
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using System.Threading;
public class Program
{
public static void Main()
{
new Program().Test();
}
public async Task Test()
{
Console.WriteLine("starting...");
await Test2();
Console.WriteLine("done!");
Thread.Sleep(2*1000);
}
public async Task Test2()
{
Console.WriteLine("Task in delay...");
await Task.Delay(5000);
}
}
Run Code Online (Sandbox Code Playgroud)
我期望输出是:
starting...
task in delay...
done!
Run Code Online (Sandbox Code Playgroud)
但是,当我运行代码时,我得到:
starting...
Task in delay...
Run Code Online (Sandbox Code Playgroud)
并且程序终止。我错过了什么吗?我应该如何修改代码才能得到预期的结果?
另一个问题 - 根据我的理解,await方法中最后一行的 using 是多余的,如果我删除它,我该如何await在该方法上?
我错过了什么吗?
是的; 你没有等到Test
public static async Task Main()
{
await new Program().Test();
}
Run Code Online (Sandbox Code Playgroud)
如果没有这个,Main一旦Test返回就会立即完成,这将是第一次await遇到不完整的情况 -async链从Task.Delay(这将是不完整的)展开,将其余的工作留在后台Test/Test2安排在后台;由于没有剩余的非后台线程,因此该进程退出。
请注意,您还可以删除任务,async即return
public static Task Main()
=> new Program().Test();
Run Code Online (Sandbox Code Playgroud)
其工作方式非常相似,尽管它稍微改变了重新同步异常的语义。如有疑问:await。