等待任务完成,在“等待”之后进行操作
c#
我知道我可能被否决了,但显然我只是不太了解 async-await 和我发现的问题/答案,以及我发现的文章,并没有帮助我找到这个问题的答案:
我怎样才能打印出“2”?或者实际上,为什么 2 在 await t 和 t.Wait() 中都没有打印出来?:
static Task t;
public static async void Main()
{
Console.WriteLine("Hello World");
t = GenerateTask();
await t;
//t.Wait();
Console.WriteLine("Finished");
}
public static Task GenerateTask()
{
var res = new Task(async () =>
{
Console.WriteLine("1");
await Task.Delay(10000);
Console.WriteLine("2");
});
res.Start();
return res;
}
编辑:我正在创建一个任务并返回它,因为在现实生活中我需要稍后从不同的方法等待这个任务。
Edit2: await Task.Delay 只是现实生活中等待不同函数的占位符。
回答
打印“2”
2 实际打印,在 1 打印后 10 秒。如果Console.ReadLine();在打印“完成”后添加,您可以观察到这一点。
输出是
Hello World
1
Finished
2
怎么了?
当您等待t(res在GenerateTask方法中)时,您正在等待创建的任务而不是res创建的任务。
如何修复(花哨的方式)
您将需要等待外部任务和内部任务。为了能够等待内部任务,您需要公开它。要公开它,您需要将任务类型从TasktoTask<Task>和返回类型从Taskto 更改Task<Task>。
它可能看起来像这样:
public static async Task Main()
{
Console.WriteLine("Hello World");
var outerTask = GenerateTask();
var innerTask = await outerTask; // what you have
await innerTask; // extra await
Console.WriteLine("Finished");
Console.ReadLine();
}
public static Task<Task> GenerateTask() // returns Task<Task>, not Task
{
var res = new Task<Task>(async () => // creates Task<Task>, not Task
{
Console.WriteLine("1");
await Task.Delay(TimeSpan.FromSeconds(10));
Console.WriteLine("2");
});
res.Start();
return res;
}
现在的输出是:
Hello World
1
2
Finished
如何修复(简单的方法)
不需要外部任务。
public static async Task Main()
{
Console.WriteLine("Hello World");
var t = GenerateTask();
await t;
Console.WriteLine("Finished");
Console.ReadLine();
}
public static async Task GenerateTask()
{
Console.WriteLine("1");
await Task.Delay(TimeSpan.FromSeconds(10));
Console.WriteLine("2");
}