更多C#事件和线程安全



我阅读了C#事件和线程安全以及MSDN 中的线程安全委托调用部分

在询问问题之前,我定义了线程安全,有三个方面:

  1. (项目1(没有坏数据R/W。(中间数据(
  2. (第2项(指令无效
  3. (第3项(缓存一致性没有影响

让我们再看看这个例子:

PropertyChanged?.Invoke(…)
var handler = this.PropertyChanged;
if (handler != null)
{
handler(…);
}

好的,在C#中,引用类型的R/W OP没有坏数据问题。所以,当调用处理程序时,它永远不会为null。但是,我仍然有问题

  1. C#的底部是否有一种机制来确保互锁的API操作实际应用于PropertyChanged,因此指令重新排序和缓存一致性不会出现问题
  2. 如果确实存在类似的互锁机制,那么它是否仅适用于委托和事件类型?对于可以使用的其他变量类型,是否有这样的保证。?操作员

【附加】

是的,我无法定义线程安全的含义。我只想给项目1-item3一个名称。我的另一个疑问来自下面的字段,类似于使用Interlocked实现的事件。CompareExchange

你称之为线程安全的东西是什么到目前为止,我们得到的代码是"线程安全",因为其他线程做什么并不重要——你不会从上面的代码中获得NullReferenceException。但是,如果其他线程正在订阅该事件或取消订阅该事件,由于以下正常原因,您可能看不到最新的更改存储器模型是复杂的。

从C#4开始,类字段事件使用联锁。CompareExchange,因此我们可以使用相应的联锁。CompareExchange调用以确保获得最新的价值无可否认,能够做到这一点并不是什么新鲜事,但这确实意味着我们可以写

带有C#6 的清洁事件处理程序发票

您需要了解关于线程安全的一件事。嗯,有几个:

  • 只有在记录时才会给出。默认情况下,NO-api是线程安全的
  • 它的成本很高。任何锁定都是有成本的,所以如果不必要的话应该避免
  • 最后,特别是当你谈到UI元素时,框架中有非常具体的线程规则——一直到窗口中的规则。STA-单线程单元,仅限一个线程。仅UI线程

所以,不,没有神奇的机制可以保证文档中没有保证的东西,因为这意味着每次都必须支付费用,大多数情况下也是在不需要的时候。

中的事件机制。NET是单线程的。时期接受它。它们回到UI中的通知机制,在那里,对于可能比你更古老的规则(即,它们回到ActiveX UI元素的时代,顺便提一下,这些元素仍然存在于即标准文件对话框中(,这是";UI中的任何东西都只会被ONE UI线程"改变";。

最新更新