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)
我认为第一种方法会用完池中的一个额外线程......它还将一个任务包装到一个额外的任务中。还是我错了?
Task.Run将其委托排队到线程池。这导致了两个重要的事情:
DoStuff第一个异步之前的任何代码await都将在线程池线程上运行,而不是在调用线程上运行。DoStuff将在线程池上下文中运行,而不是使用来自调用线程的任何当前上下文。大多数时候,异步工作Task.Run是错误的。但它有时很有用,比如如果DoStuff在异步操作之前做了一些繁重的计算工作,那么Task.Run可以用来将这些工作移出 UI 线程。