我必须处理一位前同事的代码,其中有一段我不完全理解的代码,有人可以给我介绍一下这两个代码部分的区别吗?
此代码将通知已处理的图像,几个组件将侦听并显示。
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,并且会停止调用图像。