1

我一个接一个地执行一堆操作。

基本结构是

表单的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在表单上使用来记录很多消息。这会影响它吗?如果是这样,我需要弄清楚如何阻止它破坏它。

大概如果您正在await从 UI 线程执行异步任务,那么该异步任务中的任何内容都不应阻塞 UI 线程?

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

有任何想法吗?

4

1 回答 1

3

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

于 2013-09-12T10:06:16.127 回答