如果在UI线程上运行,以下代码块是否等效?
var task = Task.Run(async () => { await DoSomething(); });
task.Wait();
vs
await DoSomething(); //Or DoSomething.Wait();
答案 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 await,A Tour of Task, Part 1: Constructors Don't Use Task.Run in the Implementation和There is no thread)。