尽管使用了await,UI线程仍然会阻塞

时间:2013-09-12 09:52:15

标签: c# winforms async-await

我一个接一个地执行一系列操作。

基本结构是

表单的Run()方法>使用Manager.DoStuff()

致电await Manager.DoStuff();

Manager.DoStuff()async Task ...

因此我从不期望它会阻止UI线程,并且它不适用于大多数事情:DoStuff方法包含以下内容:

var someTask = Something.BigTask();
var someTask2 = Something2.BigTask();
var someTask3 = Something3.BigTask();

await Task.WhenAll(someTask, someTask2, someTask3)

和一些个人,例如:

await SomethingElse.BigTask();

但是当它到达某一个时,UI线程就会陷入困境,我最终会得到一个例外,说它不是在发送消息。

方法没有什么不同,它是async Task SomeMethod()

我唯一能想到的是它在表单上使用Invoke来记录大量消息。这会影响它吗?如果是这样,我需要弄清楚如何阻止它破坏它。

大概如果你在UI线程上对异步任务进行await,那么异步任务中的任何内容都不应该阻止UI线程吗?

在对await的最高级别调用之后没有更多代码,初始Run()方法只是结束,因为这是它必须执行的最后一项任务。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

我认为你会发现,除非你的工作实际上是异步的(通常是IO)而不是阻止没有异步IO的工作,否则调用将同步执行。考虑Task.Run在ThreadPool中运行,甚至Task.Factory.StartNew(theCall, TaskCreationOptions.LongRunning) ... http://msdn.microsoft.com/en-us/library/dd321263.aspx