.NET组件程序设计 第8章 多线程和并发管理 同步委托

.NET中调用委托前必须检查值是否为NULL,否者会引发一空引用异常。

但对于多线程环境,此种检查任然不够,因为访问委托时可能发生竞态条件。

public class Publisher
{
    public event EventHandler MyEvent;
    public void Fire()
    {
        //将委托传入一个方法,目的为了拷贝委托,因此方法中检查调用的只是某一临时变量,而非原来的委托
        //委托为一不可变对象,对委托所做任何改变,都将导致在堆上创建一新委托
        Fire(MyEvent);
    }

    //为避免JIT优化代码,使用内联,直接使用委托对象,导致竞态条件
    //使用该特性,通知JIT在任何情况下,方法参数都不要内联
    [MethodImpl(MethodImplOptions.NoInlining)]
    private void Fire(EventHandler handler)
    {
        if(handler != null)
        {
            handler(this, EventArgs.Empty);
        }
    }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值