C# 监视器。等待,然后单击;exitContext“;参数

C# 监视器。等待,然后单击;exitContext“;参数,c#,.net,multithreading,synchronization,C#,.net,Multithreading,Synchronization,MSDN文档中提到了“exitContext”布尔参数: 如果为true,则退出并重新获取 上下文的同步域 (如果在同步上下文中)之前 等待;否则,错误 我不明白。假设我已经理解pulse和wait,有人能给出这个参数的手持解释吗?一个实用的使用示例将非常有价值 这与远程处理场景相关,传递true允许传递另一个调用。这个完全相同的参数也是将WaitHandle.WaitOne(int)重载添加到.NET2.0SP1的原因。一个破坏兼容性的变化,造成了很多痛苦。以前只有WaitOne(int,bo

MSDN文档中提到了“exitContext”布尔参数:

如果为true,则退出并重新获取 上下文的同步域 (如果在同步上下文中)之前 等待;否则,错误


我不明白。假设我已经理解pulse和wait,有人能给出这个参数的手持解释吗?一个实用的使用示例将非常有价值

这与远程处理场景相关,传递true允许传递另一个调用。这个完全相同的参数也是将WaitHandle.WaitOne(int)重载添加到.NET2.0SP1的原因。一个破坏兼容性的变化,造成了很多痛苦。以前只有WaitOne(int,bool)重载可用,没有人知道exitContext参数的含义


传递false是正常用法。我愉快地认为,我自己并不知道任何实际的例子,在这些例子中,使用true要么有意义,要么会有好的结果。远程处理的核心是相当复杂且缺乏文档记录。WCF让它变得无关紧要。

这是.net框架中一个非常古老的缺点;只是在错误中过去,然后继续前进

他们所指的“上下文”是远程处理上下文。您可以通过在MSDN中查找ContextBoundObject来尝试运行该概念;这会让你找到各种有趣的东西。在CLR设计的某个阶段,这些“对象上下文”将比它们实际结束时重要得多;许多人一开始就忘记了它们的存在,大多数人遇到的唯一一个与CBO有关的API就是Monitor.Wait

因此,只需输入false并继续前进。:)

如果你想的话,我们可以更深入

有一个概念是将这些对象上下文之一配置为“同步”。事实证明,在CLR中,每个线程都有一个与其关联的逻辑调用上下文。使用远程处理进行方法调用时,此逻辑调用上下文将随调用一起传递,以便远程处理边界另一侧的CLR可以将处理请求的线程视为逻辑上相同的线程。如果被调用的对象(远程处理边界另一侧的对象)调用回原始对象,那么第二个调用可能在不同的物理线程上。但是,由于逻辑调用上下文随远程处理调用一起流动,第二个物理线程可以重新进入“同步”上下文

这方面的一个例子很难在这里写出。我可以按要求给你写一封,但是


这是.net框架中一个非常古老的缺点;只需输入false并继续前进。:)