“异步任务”与“返回 Task.Run”

Ale*_*lex 0 c# asynchronous async-await

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

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

//then call it
await LongRunningMethod();
Run Code Online (Sandbox Code Playgroud)

和这个

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

//then call it
await LongRunningMethod();
Run Code Online (Sandbox Code Playgroud)

我认为第一种方法会用完池中的一个额外线程......它还将一个任务包装到一个额外的任务中。还是我错了?

Ste*_*ary 7

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

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

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