自动调用跨线程操作

时间:2014-04-07 17:59:01

标签: c# wpf multithreading task-parallel-library

这种情况是否有任何解决方案:

我在新线程上做了一些耗时的事情(使用Tasks)。在这个线程中,我想更新UI元素(文本),以便用户知道会发生什么。这应该是实时发生的,而不仅仅是在任务完成时。

如果我想更改某些内容,我必须显式调用Dispatcher.Invoke()(它是UI-Thread调度程序)。有没有办法异步运行某些东西而不必显式调用?我找到了一个使用TaskFactory并指定TaskScheduler的解决方案。但这会在进行UI调用时锁定UI。

有没有办法在不锁定UI的情况下执行此操作?

编辑:由于一些轻微的误解,这个编辑。 一旦我打电话给

,我想要那个
uiControl.Text = "Test 123";
如果需要,在UI-Thread上自动调用的worker-thread上的

。所以在这种情况下需要它,但我想摆脱所有这些Invoke调用。所以,如果有一个漂亮的解决方案,它会很棒。否则我必须使用显式调用,不是很好但是没问题。

2 个答案:

答案 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