【发布时间】:2011-05-23 19:34:15
【问题描述】:
MSDN 文档中提到了“exitContext”布尔参数:
true 退出并重新获取 上下文的同步域 (如果在同步上下文中)之前 这段等待;否则为假。
我不关注。假设我已经了解脉冲和等待,任何人都可以对这个参数进行解释吗?一个实际的使用示例将非常有价值。
【问题讨论】:
标签: c# .net multithreading synchronization
MSDN 文档中提到了“exitContext”布尔参数:
true 退出并重新获取 上下文的同步域 (如果在同步上下文中)之前 这段等待;否则为假。
我不关注。假设我已经了解脉冲和等待,任何人都可以对这个参数进行解释吗?一个实际的使用示例将非常有价值。
【问题讨论】:
标签: c# .net multithreading synchronization
这是 .net 框架中的一个非常古老的缺陷;只需传入 false 并继续。
他们所指的“上下文”是一个远程上下文。您可以尝试通过在 MSDN 中查找 ContextBoundObject 来了解该概念;这将引导您找到各种有趣的东西。在 CLR 设计的某一时刻,这些“对象上下文”将比它们实际最终重要得多;许多人一开始就忘记了它们的存在,大多数人遇到的唯一与 CBO 有关的 API 是 Monitor.Wait。
所以只需传入 false 并继续前进。 :)
如果你愿意,我们可以走得更深……
存在将这些对象上下文之一配置为“同步”的概念。事实证明,在 CLR 中,每个线程都有一个与之关联的逻辑调用上下文。当您使用远程处理进行方法调用时,此逻辑调用上下文会随调用一起传递,以便远程处理边界另一侧的 CLR 可以将处理请求的线程视为逻辑上相同的线程。如果被调用的对象(远程边界另一侧的对象)回调原始对象,则第二次调用可能在不同的物理线程上。但是,由于逻辑调用上下文与远程调用一起流动,第二个物理线程可以重新进入“同步”上下文。
尝试在这里写出这样的一个例子是非常复杂的。我可以按需为你写一篇,但是……
这是 .net 框架中的一个非常古老的缺陷;只是传递错误并继续前进。 :)
【讨论】:
在远程处理场景中是相关的,传递 true 允许传递另一个调用。这个完全相同的论点也是将 WaitHandle.WaitOne(int) 重载添加到 .NET 2.0 SP1 的原因。兼容性破坏性更改导致了很多痛苦。以前只有 WaitOne(int, bool) 重载可用,没有人知道 exitContext 参数的含义。
传递false是正常的用法。我很高兴自己不知道使用 true 可能有意义或有好的结果的任何实际示例。远程处理的核心是相当复杂且记录不充分。 WCF 让它变得无关紧要。
【讨论】: