这种情况是否有任何解决方案:
我在新线程上做了一些耗时的事情(使用Tasks)。在这个线程中,我想更新UI元素(文本),以便用户知道会发生什么。这应该是实时发生的,而不仅仅是在任务完成时。
如果我想更改某些内容,我必须显式调用Dispatcher.Invoke()(它是UI-Thread调度程序)。有没有办法异步运行某些东西而不必显式调用?我找到了一个使用TaskFactory并指定TaskScheduler的解决方案。但这会在进行UI调用时锁定UI。
有没有办法在不锁定UI的情况下执行此操作?
编辑:由于一些轻微的误解,这个编辑。 一旦我打电话给,我想要那个uiControl.Text = "Test 123";
如果需要,在UI-Thread上自动调用的worker-thread上的。所以在这种情况下需要它,但我想摆脱所有这些Invoke调用。所以,如果有一个漂亮的解决方案,它会很棒。否则我必须使用显式调用,不是很好但是没问题。
答案 0 :(得分:1)
PostSharp将此实现为方法级别方面。在实现方面,它意味着您使用[DispatchedMethod]
属性修饰方法,并且每次调用它时(通过任何线程)都将调度到UI线程。请查看此处了解更多详情:
http://www.postsharp.net/aspects/examples/multithreading
http://www.postsharp.net/threading/thread-dispatching
http://doc.postsharp.net/##T_PostSharp_Patterns_Threading_DispatchedAttribute
答案 1 :(得分:-2)
您可以在主线程上执行操作,并且不时调用Application.DoEvents()以处理UI事件...
请注意,这仅适用于winforms,因此可能不是正确答案。
HighCore建议将此作为更好的答案https://stackoverflow.com/a/21884638/643085