识别EventHandler的最后订阅事件c#

时间:2014-12-11 09:56:36

标签: c# silverlight asynchronous event-handling asynccallback

我有一个银灯应用程序,其中异步调用服务方法。我需要识别最后订阅的事件并执行特定操作。如下例所示。

foreach(var proj in lstProj)
{
 ServiceApi.CreateTemplateInfoAsync(proj.Id, proj.Name);
 ServiceApi.CreateTemplateInfoCompleted += new EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(ServiceApi_CreateTemplateInfoCompleted);
}

例如,上述实现迭代10次,我想知道最后订阅的事件并执行操作。

void ServiceApi_CreateTemplateInfoCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                LogErrorInfo(m_ClassName, "CreateTemplateInfoCompleted", e.Error.InnerException.Message, true);
            }
            UtilityApp.ServiceApi.CreateTemplateInfoCompleted -= ServiceApi_CreateTemplateInfoCompleted;

//Check a condition here to know there are no more subscribed events and do an operation.
If(no more subscriber for CreateTemplateInfoCompleted)
{
//Do something.
}
        }

我已经看到这可以从CreateTemplateInfoCompleted.GetInvocationList()获得,但我没有看到该方法在intellisense中显示或可用。请提供建议。

1 个答案:

答案 0 :(得分:0)

GetInvocationList()是MulticastDelegate的一种方法,仅当您的类拥有该事件时才可用。其他类只能订阅/取消订阅该事件。

在您的情况下,我建议保留和用于订阅该事件的其他代表列表,并使该列表与您的操作保持同步。类似于:List<EventHandler<System.ComponentModel.AsyncCompletedEventArgs>>,每次订阅该事件时,将您的委托添加到此列表中,然后使用它。 (如果使用异步,请注意同步问题)

最好的方法是考虑为整个方法设计一个更好的设计。