创建任务并“等待”它是否与同步运行某项任务或等待异步方法相同?

时间:2019-01-22 05:00:46

标签: c# async-await

如果在UI线程上运行,以下代码块是否等效?

var task = Task.Run(async () => { await DoSomething(); });
task.Wait();

vs

await DoSomething(); //Or DoSomething.Wait();

2 个答案:

答案 0 :(得分:3)

  

如果在UI线程上运行,以下代码块是否等效?

不,他们不是。第一个将阻止 UI线程 / 消息泵,第二个则不会。

第一种方法是尝试同步运行一个async方法,并且将导致任何理智的代码审查失败(除了最罕见的情况)。第一个示例应更改为第二个示例恕我直言

  

正在创建任务并“等待”它与运行某些东西一样   同步吗?

如果您将 Synchronous 代码定义为“ 按顺序排列的一堆语句,那么您的代码中的每个语句都会一个接一个地执行,并且在等待之前没有代码”。然后,您可以提出索赔。

但是,如果您执行类似操作,则不会

var task = Task.Run(SomeAwesomeTask);

// lots more code here

task.Wait();

答案 1 :(得分:1)

  

创建任务并“等待”它是否与同步运行相同?

以下代码是;创建任务,创建新线程并在新线程上运行代码。

var task = Task.Run(async () => { await DoSomething(); });

重要的是要知道所有这些事情都会发生

假设签名:

async Task DoSomething()

以下所有语句在本质上都是不同的:

Task.Run(async () => { await DoSomething(); });
await DoSomething(); 
DoSomething().Wait();

我认为我无法详细介绍所有这些细节(很多细节),但是Stephen Cleary的文章中有很多对此细节进行了详细介绍(Async and awaitA Tour of Task, Part 1: Constructors Don't Use Task.Run in the ImplementationThere is no thread)。