代码之家  ›  专栏  ›  技术社区  ›  David Klempfner

什么是“伪异步”方法?

  •  0
  • David Klempfner  · 技术社区  · 3 年前

    我读过这个 article 提供了此示例:

    class MyService
    {
      public int CalculateMandelbrot()
      {
        // Tons of work to do in here!
        for (int i = 0; i != 10000000; ++i);
        return 42;
      }
     
      public Task CalculateMandelbrotAsync()
      {
        return Task.Run(() => CalculateMandelbrot());
      }
    }
    

    它将其描述为:

    创建了一个伪异步方法,因为它所做的是将一个同步方法封装在另一个线程(与UI不同)中。

    然后它说:

    建议的实现如图6所示。由于最初 问题,没有阻塞UI的线程,解决方案失败了 在同一UI中,而不是在服务实现中。

    指的是这种方法:

    private async void GetMandelbrot() //Called from UI
    {
      await Task.Run(() => myService.CalculateMandelbrot());
    }
    

    为什么第一个是“伪异步”而不是第二个?

    难道他们两个都创建了一个除了 CalculateMandelbrot() ?

    0 回复  |  直到 3 年前
        1
  •  -1
  •   Jonesopolis    3 年前

    我不认为“伪异步”是一个常用的术语(我从未听说过),这里也没有明确的定义。

    我对这篇文章的看法是,他们将第一个方法称为假异步,因为它实际上没有async/await关键字。第二个是,所以它是“真正的”异步(再说一遍,我真的不喜欢这些术语)。

    不过,当您使用async和wait关键字时, 很多 在代码的引擎盖下继续创建一个状态机来释放一个线程,然后另一个线程可以在操作准备好继续时拾取并继续执行。