Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 手动将其连接到线程_C#_Multithreading - Fatal编程技术网

C# 手动将其连接到线程

C# 手动将其连接到线程,c#,multithreading,C#,Multithreading,在WinForms中,您有Control.BeginInvoke(),这意味着您可以对后台线程到创建控件句柄的主UI线程的调用进行封送处理 这很好,但是(在C#中)如何在两个“标准”线程之间执行此操作 我已经编写了一个服务总线,它有一个处理器线程来使用消息。我希望启动一个计时器,这会导致处理器线程执行某些操作,而不是计时器线程中运行的代码 当然,我可以使用线程同步(Monitor/using(){…}),但我想知道它是如何正常完成的。Windows窗体运行一个线程,这就是为什么您可以将各种任务马

在WinForms中,您有
Control.BeginInvoke()
,这意味着您可以对后台线程到创建控件句柄的主UI线程的调用进行封送处理

这很好,但是(在C#中)如何在两个“标准”线程之间执行此操作

我已经编写了一个服务总线,它有一个处理器线程来使用消息。我希望启动一个计时器,这会导致处理器线程执行某些操作,而不是计时器线程中运行的代码

当然,我可以使用线程同步(
Monitor
/
using(){…}
),但我想知道它是如何正常完成的。

Windows窗体运行一个线程,这就是为什么您可以将各种任务马歇尔到UI线程的原因-它会在队列中重复查找消息,这些消息可以跨线程边界发送


如果要手动执行,可以创建自己的消息循环(用于一个或多个线程),或者使用更简单的同步原语。对于这种情况似乎是合适的。您只需要在正确的位置调用
Set
WaitOne
方法(当然要注意死锁)。

不幸的是,这里很难给出答案,因为它高度依赖于线程的性质

线程之间的封送不是魔法。有一种潜在的机制使之成为可能。例如,在WinForms中,Control.Invoke样式函数通过消息传递工作。有一条消息发布到UI线程,消息泵最终将泵送该消息并将其转换为封送调用

为了在标准线程之间封送一个调用,它必须具有某种能力,通过这种能力,它可以检测想要发生的封送调用,然后使该调用发生。这通常通过某种类型的消息传递来完成


依我看,最标准的方法是让线程实现、提供和安装SynchronizationContext。这是在线程之间定义封送机制的更标准的方法

SynchronizationContext是我想要的答案-谢谢!