首页 > 解决方案 > “异步任务”与“返回 Task.Run”

问题描述

我是 async/await c# 模型的新手,并试图了解这两个选项是否本质上是同一件事:

public Task LongRunningMethod()
{
    return Task.Run(async () =>
    {
        await DoStuff();
    });
}

//then call it
await LongRunningMethod();

还有这个

public async Task LongRunningMethod()
{
    await DoStuff();
}

//then call it
await LongRunningMethod();

我在想第一种方式会用完池中的一个额外线程......而且它还将一个任务包装成一个额外的任务。还是我错了?

标签: c#asynchronousasync-await

解决方案


Task.Run将其委托排队到线程池。这导致了两个重要的事情:

  1. DoStuff第一次异步之前的任何代码await都将在线程池线程上运行,而不是在调用线程上
  2. 中的代码DoStuff将在线程池上下文中运行,而不是使用调用线程当前的任何上下文

大多数时候,做异步工作Task.Run是一个错误。但它有时很有用,例如,如果DoStuff在异步操作之前进行一些繁重的计算工作,那么Task.Run可以用来将该工作移出 UI 线程。


推荐阅读