[英]Despite using await, the UI thread still blocks
我接连执行一堆操作。
基本结构是
形式的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()方法只是结束,因为这是它必须执行的最后一项任务。
有任何想法吗?
我认为您会发现,在执行实际上是异步的(通常是IO)而不是阻塞没有异步IO的工作之前,调用将同步执行。 考虑将Task.Run
运行在ThreadPool甚至是Task.Factory.StartNew(theCall, TaskCreationOptions.LongRunning)
... http://msdn.microsoft.com/zh-cn/library/dd321263.aspx
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.