在ui线程中执行委托(使用消息泵)

Pio*_*pla 4 .net c# multithreading message-queue thread-safety

我有一个后台线程来处理与外部服务的通信.每次后台线程收到消息时,我都想将其传递给UI线程进行进一步处理(显示给用户).

目前我已经创建了一个线程安全的消息队列,它在Timer.Tick中定期汇集并填充后台线程.但这种解决方案是次优的.

你知道如何使用消息泵将事件从后台线程传递到ui线程吗?

Kev*_*yon 7

您可以使用Control.Invoke并使用委托.委托将在创建控件的线程上执行.

http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx


Gre*_*g D 5

有一些技巧。

  1. Control.Invoke() (等)

    我发现这种winforms技术始终易于使用,但是请注意,您需要正确制定一些细微的规则。我试图捕获一个通用的有效实现,该实现可以正确处理我在stackoverflow上其他地方发布的代码段中的规则。

  2. SynchronizationContext

    我不需要太多使用这项技术,因此我真的不能说出任何有意义的信息。您应该知道它存在。我相信,这是确保某些线程在特定线程的上下文中被调用的有效方法,即使该线程不是 ui线程也是如此。

  3. DispatcherObject.Dispatcher

    如果使用WPF,则WPF控件通常将派生自来DispatcherObject提供Dispatcher对象。与相比,这是一种功能更丰富的同步技术Control.Invoke(),但也更加复杂。请务必仔细阅读文档。