C#事件调用和同步

时间:2020-08-25 17:13:32

标签: c# winforms events synchronization

我必须处理一位前同事的代码,其中有一段我不完全理解的代码,有人可以给我介绍一下这两个代码部分的区别吗?

此代码将通知已处理的图像,几个组件将侦听并显示。

public event EventHandler<ImageProcessedEventArgs> ImageProcessed;

我不明白/看不到的代码如下。可以改进/简化吗?

public void OnImageProcessed(ImageProcessedEventArgs e)
{   
    if (ImageProcessed != null)
    {
        if (Interlocked.Increment(ref imgProcTickets) == 1)
        {
            var delLst = ImageProcessed.GetInvocationList();
            int numFiredEvt = delLst.Length;

            foreach (var del in delLst)
            {
                (del as EventHandler<ImageProcessedEventArgs>).BeginInvoke(
                    this,
                    e,
                    iar =>
                    {
                        if (Interlocked.Decrement(ref numFiredEvt) == 0)
                            Interlocked.Decrement(ref imgProcTickets);

                        try
                        {
                            var evtHandler = iar.AsyncState as
                                EventHandler<ImageProcessedEventArgs>;

                            evtHandler.EndInvoke(iar);
                        }
                        catch { }
                    },
                    del
                );
            }
        }
        else
            Interlocked.Decrement(ref imgProcTickets);
    }
}

为什么不能与以下内容类似?

public void OnImageProcessed(ImageProcessedEventArgs e)
{
    ImageProcessed?.Invoke(this, e);
}

我遇到的问题是,在现有代码(排名靠前的代码)中,imgProcTickets有时会变得大于1,并且会停止调用图像。

0 个答案:

没有答案
相关问题