跨线程操作的自动调用

本文关键字:调用 线程 操作 | 更新日期: 2023-09-27 17:57:26

对于这种情况有什么解决方案吗:

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

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

有没有一种方法可以做到这一点,而不锁定用户界面?

编辑:由于一些小的误解,这次编辑。我想一旦我打电话给

uiControl.Text = "Test 123";

如果需要,将在UI线程上自动调用。所以在这种情况下,它是必要的,但我想去掉所有这些Invoke调用。因此,如果有一个漂亮的解决方案,那就太好了。否则,我必须使用显式调用,虽然不好,但可以。

跨线程操作的自动调用

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

您可以在主线程上执行操作,只需不时调用Application.DoEvents()即可处理UI事件。。。

请注意,这只适用于winforms,因此可能不是正确的答案。

HighCore认为这是一个更好的答案https://stackoverflow.com/a/21884638/643085