【发布时间】: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