我有以下代码,用于测试C#上的任务框架
static void Main(string[] args)
{
Task<string> task1 = AsyncA();
task1.ContinueWith(Print);
Task<string> task2 = AsyncB();
task2.ContinueWith(Print);
Task.WaitAll(new Task[] {task1, task2});
}
static async Task<string> AsyncA()
{
Thread.Sleep(1500);
return "A";
}
static async Task<string> AsyncB()
{
Thread.Sleep(430);
return "B";
}
static async void Print(Task<string> str)
{
Console.WriteLine(str.Result);
}
我的输出如下:
一个
乙
我做错了什么? 提前谢谢。
答案 0 :(得分:9)
您正在同步运行方法AsyncA
和AsyncB
。如果您使用async
,则需要await
任务结束。将您的方法更改为
static async Task<string> AsyncA()
{
await Task.Delay(1500);
return "A";
}
static async Task<string> AsyncB()
{
await Task.Delay(430);
return "B";
}
您将得到预期的
输出乙
甲
如需进一步参考,请查看the MSDN example
修改强>
为了完整起见,您还应该以相同的方式更改Print
方法,否则它也会同步运行到目前为止。
因为在这个方法中你可以通过参数获得任务,你可以直接在Console.WriteLine
方法中等待结果:
static async void Print(Task<string> str)
{
Console.WriteLine(await str);
}
答案 1 :(得分:2)
首先,在使用异步方法时,通常更容易使用等待的Task.Delay(ms)
而不是Thread.Sleep(ms)
。
在MSDN文档中,ContinueWith(task)
方法:
创建在目标任务完成时异步执行的延续。
出于这个原因,只有task1
完成后,它才会执行剩余的代码 - 这就是你的输出是A B而不是B A的原因。
使用Task.Delay(ms)
并等待方法而不是使用ContinueWith(task)
,您将获得预期的输出。