我有一个银光应用程序,其中异步调用服务方法。我需要识别上次订阅的事件并执行特定操作。对于如下所示的示例。
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()
中获得,但是我没有看到该方法显示在智能感知中或可用。请提供建议。
GetInvocationList()
是多播委托的一种方法,仅当您的类拥有该事件时才可用。其他课程只能订阅/取消订阅活动。
在您的情况下,我建议保留用于订阅该事件的代表和其他列表,并使该列表与您的操作保持同步。像这样:List<EventHandler<System.ComponentModel.AsyncCompletedEventArgs>>
每次订阅该活动时,将您的委托添加到此列表中,然后使用它。(如果您使用的是异步,请注意同步问题)
不过,最好的方法是为整个方法考虑更好的设计。