首先请注意,此问题未标记为winforms或wpf或任何其他特定于 GUI 的内容。这是有意的,你很快就会看到。
其次,对不起,如果这个问题有点长。我试图将到处飘荡的各种信息汇集在一起,以提供有价值的信息。然而,我的问题就在“我想知道的”下面。
我的任务是最终了解 .NET 提供的在特定线程上调用委托的各种方法。
我想知道的:
我正在寻找最通用的方式(不是 Winforms 或 WPF 特定的)来调用特定线程上的委托。
或者,换种说法:我会感兴趣,如果以及如何,不同的方式来做到这一点(例如通过 WPF's
Dispatcher
)相互利用;也就是说,如果所有其他人都使用一种通用的跨线程委托调用机制。
我已经知道的:
有很多与这个主题相关的课程;其中:
SynchronizationContext
(inSystem.Threading
)
如果我不得不猜测,那将是最基本的一个;虽然我不明白它到底是做什么的,也不知道它是如何使用的。AsyncOperation
& (in ) 这些似乎是. 不知道如何使用它们。AsyncOperationManager
System.ComponentModel
SynchronizationContext
WindowsFormsSynchronizationContext
(inSystem.Windows.Forms
)
的子类SynchronizationContext
。ISynchronizeInvoke
(inSystem.ComponentModel
)
由 Windows 窗体使用。(Control
该类实现了这一点。如果我不得不猜测,我会说这个实现使用了WindowsFormsSynchronizationContext
.)Dispatcher
& (in ) 似乎后者是 的另一个子类,而前者代表它。DispatcherSynchronizationContext
System.Windows.Threading
SynchronizationContext
一些线程有自己的消息循环以及消息队列。
(关于消息和消息队列的 MSDN 页面有一些关于消息循环如何在系统级别工作的介绍性背景信息,即作为 Windows API 的消息队列。)
我可以看到如何为带有消息队列的线程实现跨线程调用。
PostThreadMessage
使用 Windows API,您可以通过包含调用某个委托的指令将消息放入特定线程的消息队列中。在该线程上运行的消息循环最终将获得该消息,并且将调用委托。根据我在 MSDN 上阅读的内容,线程不会自动拥有自己的消息队列。例如,当一个线程创建了一个窗口时,一个消息队列将变得可用。没有消息队列,线程有消息循环是没有意义的。
那么,当目标线程没有消息循环时,是否可以进行跨线程委托调用?比方说,在 .NET 控制台应用程序中?(从这个问题的答案来看,我想控制台应用程序确实不可能。)