线程无法正常工作

时间:2017-03-21 17:15:10

标签: multithreading c#-4.0 task

我有以下代码,用于测试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);
   }

我的输出如下:

  

一个
     乙

我做错了什么? 提前谢谢。

2 个答案:

答案 0 :(得分:9)

您正在同步运行方法AsyncAAsyncB。如果您使用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),您将获得预期的输出。