【问题标题】:What is a "false asynchronous" method?什么是“假异步”方法?
【发布时间】:2021-10-11 06:48:15
【问题描述】:

我阅读了提供此示例的 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()之外什么都不能做的新任务吗?

【问题讨论】:

  • for (int i = 0; i != 10000000; ++i); return 42; ?? ;-)
  • @JeroenvanLangen 这只是一个例子。这与实际计算 Mandelbrot 无关。
  • 服务不应该假装它不是什么,它不应该知道关于 UI 层的任何事情。调用者的工作是确保在正确的线程上启动长时间运行的任务。

标签: c# asynchronous async-await parallel-processing


【解决方案1】:

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

我对这篇文章的看法 - 他们将第一种方法称为错误异步,因为它实际上没有 async/await 关键字。第二个确实如此,所以它是“真正的”异步(同样,我不太喜欢这些术语)。

当你使用 async 和 await 关键字时,很多在代码的底层继续创建一个状态机来释放一个线程,然后另一个线程可以拿起并恢复当操作准备好继续时执行。

【讨论】:

  • 我没有对你投反对票,但这并不能回答问题。
  • 是的,这不是 SO 希望的问题的直接答案,但我觉得这个问题本身非常误导。我希望为 OP 提供更多信息,以便对 async/await 自己进行更多研究并测试它如何影响基于 UI 线程的应用程序
  • 你可以有public async Task CalculateMandelbrotAsync() { await Task.Run(() => CalculateMandelbrot()); }(即withawait关键字),它会和原来的版本一样假。请看top comment中提到的文章。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
  • 2017-06-09
  • 2017-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多