等待同步的异步方法是否可以接受?

Nib*_*Pig 2 c# async-await

我很确定这里某处有一个副本,但我找不到它。

很简单,最好这样做:

await MyMethod();
Run Code Online (Sandbox Code Playgroud)

和:

public async Task MyMethod()
{
   Thread.Sleep(10000); // Simulates long running operation
}
Run Code Online (Sandbox Code Playgroud)

或涉及 Task.Run 的东西?

public async Task MyMethod()
{
   await Task.Run(() => Thread.Sleep(10000)); // Simulates long running operation
}
Run Code Online (Sandbox Code Playgroud)

实际长时间运行的操作是一个不支持异步的阻塞调用。

第一个例子显然有 Visual Studio 抱怨它会同步运行。使该方法异步的原因是因为我希望人们能够轻松地await使他们不会占用他们的线程。

Joh*_*lay 5

使用await你的第一个例子是没用的,因为Task将只返回一旦方法完成,此时Task也完成了。

我也不会使用第二个例子;不要假设调用者希望该方法在线程池上运行;让他们自己决定:

public void MyMethod()
{
   Thread.Sleep(10000); // Simulates long running operation
}
Run Code Online (Sandbox Code Playgroud)

呼叫者:

await Task.Run(MyMethod);
Run Code Online (Sandbox Code Playgroud)

我认为这里的关键是,如果一个方法不是真正的异步,它不应该声称是这样。

在某处,一个线程被阻塞,无论是当前(UI)线程还是线程池中的另一个线程。

Task.Run 由于在线程之间切换而带来开销,这可能会超过好处,具体取决于使用者。

在 ASP.NET 环境中,最好同步运行该方法;HTTP 响应只能在操作完成后发送,那么为什么要引入开销呢?

在桌面环境中,保持 UI 线程响应是关键,因此创建的开销是值得的。