C#中的异步方法不是异步的吗?

前端之家收集整理的这篇文章主要介绍了C#中的异步方法不是异步的吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
创建了以下控制台应用程序后,我有点困惑为什么它似乎同步运行而不是异步运行:
  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Stopwatch stopwatch = new Stopwatch();
  6. stopwatch.Start();
  7. var total = CreateMultipleTasks();
  8. stopwatch.Stop();
  9.  
  10. Console.WriteLine("Total jobs done: {0} ms",total.Result);
  11. Console.WriteLine("Jobs done in: {0} ms",stopwatch.ElapsedMilliseconds);
  12. }
  13.  
  14. static async Task<int> CreateMultipleTasks()
  15. {
  16. var task1 = WaitForMeAsync(5000);
  17. var task2 = WaitForMeAsync(3000);
  18. var task3 = WaitForMeAsync(4000);
  19.  
  20. var val1 = await task1;
  21. var val2 = await task2;
  22. var val3 = await task3;
  23.  
  24. return val1 + val2 + val3;
  25.  
  26. }
  27.  
  28. static Task<int> WaitForMeAsync(int ms)
  29. {
  30. Thread.Sleep(ms);
  31. return Task.FromResult(ms);
  32. }
  33. }

运行应用程序时,输出为:

Total jobs done: 12000 ms
Jobs done in: 12003 ms

我原以为是会像以下一样:

Total jobs done: 12000 ms
Jobs done in: 5003 ms

这是因为当我使用Thread.Sleep方法时它会停止进一步执行整个应用程序吗?或者我错过了一些重要的东西?

解决方法

您以同步方式运行任务.你可以这样做:
  1. static async Task<int> CreateMultipleTasks()
  2. {
  3. var task1 = Task.Run<int>(() => WaitForMeAsync(5000));
  4. var task2 = Task.Run<int>(() => WaitForMeAsync(3000));
  5. var task3 = Task.Run<int>(() => WaitForMeAsync(4000));
  6.  
  7. Task.WaitAll(new Task[] { task1,task2,task3 });
  8.  
  9. return task1.Result + task2.Result + taks3.Result;
  10.  
  11. }

连续使用三个await将不会并行运行任务.它将在等待时释放线程(如果你使用等待Task.Delay(ms),因为Thread.Sleep(ms)是一个阻塞操作),但当task1处于“休眠”时,当前执行将不会继续task2.

猜你在找的C#相关文章