【问题标题】:Perform multiple actions in same time同时执行多个动作
【发布时间】:2016-06-20 22:01:19
【问题描述】:

我想使用异步任务同时执行多个循环(我不想使用Parallel.ForEach

我愿意:

static async void Run()
{
    await MultiTasks();
}

static async Task MultiTasks()
{
    var Loop1 = Loop1Async();
    var Loop2 = Loop2Async();

    await Loop1;
    await Loop2;
}

static async Task Loop1Async()
{
    for (int i = 0; i < 500; i++)
    {
        Console.WriteLine("Loop 1 : " + i);
    }
}

static async Task Loop2Async()
{
    for (int i = 0; i < 500; i++)
    {
        Console.WriteLine("Loop 2 : " + i);
    }
}

Run() 在我的 Main 方法中被调用。

但是这两个循环不是同时执行的。第一圈完成后,第二圈开始

为什么以及如何做到这一点?

【问题讨论】:

  • 如果 Loop1AsyncLoop2Async 实际上是异步的,那么代码会产生您期望的结果...但是由于两者都是同步代码,因此可以正常运行。
  • @DStanley 你可能指的是其他方法,而不是Thread.Sleep...不是每个人都知道Task.Delay 是“睡眠”...

标签: c# task multitasking


【解决方案1】:

您对await 的初学者有一个常见的基本误解。

让我非常清楚这一点。 Await 不会进行异步操作。它异步等待异步操作完成

您正在等待同步操作。您正在调用的方法绝对没有异步; await 不会使它们异步。相反,如果它们异步的,那么await 将立即将控制权返回给调用者,以便调用者可以继续工作。当异步工作完成时,在未来的某个时间点执行该方法的其余部分,结果为awaited。

【讨论】:

    【解决方案2】:

    Loop1AsyncLoop2Async 实际上是同步的。考虑使用WriteLineAsync 方法。

    您也可以在MultiTasks 中使用Task.WhenAll

    【讨论】:

      【解决方案3】:

      试试.WhenAll(...)

      static async Task MultiTasks()
      {
          var Loop1 = Loop1Async();
          var Loop2 = Loop2Async();
      
          await Task.WhenAll(Loop1, Loop2);
      }
      

      正如其他人所指出的,您的 async 方法目前不会产生执行。

      您需要一些允许线程让步回系统的东西,这样它们才能真正并行运行。像这样的...

      static async Task Loop1Async()
      {
          for (int i = 0; i < 500; i++)
          {
              Console.WriteLine("Loop 1 : " + i);
              await Task.Yield();
          }
      }
      
      static async Task Loop2Async()
      {
          for (int i = 0; i < 500; i++)
          {
              Console.WriteLine("Loop 2 : " + i);
              await Task.Yield();
          }
      }
      

      【讨论】:

        【解决方案4】:

        您的 Loop1AsyncLoop2Async 方法内部没有 await。对于要成为 async 的方法,它需要有 1 个或多个 await

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-01-24
          • 2017-03-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-30
          • 1970-01-01
          相关资源
          最近更新 更多