C# 将委托类型强制转换为委托并调用EndInvoke

C# 将委托类型强制转换为委托并调用EndInvoke,c#,multithreading,delegates,C#,Multithreading,Delegates,我继承了一些我试图重构的冗长、重复的代码。其中的裸骨如下: private void startThreads() { RunRemoteCmdDelegate runRemoteCmdDlg = new RunRemoteCmdDelegate(services.runRemoteCommand); List<IAsyncResult> returnTags = new List<IAsyncResult>(); // asynchr

我继承了一些我试图重构的冗长、重复的代码。其中的裸骨如下:

private void startThreads() 
{ 
    RunRemoteCmdDelegate runRemoteCmdDlg = new RunRemoteCmdDelegate(services.runRemoteCommand); 

    List<IAsyncResult> returnTags = new List<IAsyncResult>(); 

    // asynchronously invokes the delegate multiple times
    foreach (...) 
    { 
        returnTags.Add(runRemoteCmdDlg.BeginInvoke(...)); 
    } 

    MonitorTasks(runRemoteCmdDlg, messages, returnTags, invokationCounter); 

} 

private void MonitorTasks(RunRemoteCmdDelegate theDelegate, List<IAsyncResult> returnTags) 
{ 

        foreach (IAsyncResult returnTag in returnTags) {
            MessageType message = runRemoteCmdDlg.EndInvoke(returnTag);
            messages.Add(message)
        } 
}
private void startThreads()
{ 
RunRemoteCmdDelegate runRemoteCmdDlg=新的RunRemoteCmdDelegate(services.runRemoteCommand);
List returnTags=新列表();
//异步调用委托多次
foreach(…)
{ 
returnTags.Add(runRemoteCmdDlg.BeginInvoke(…);
} 
监视任务(runRemoteCmdDlg、消息、返回标记、invokationCounter);
} 
私有无效监视任务(RunRemoteCmdDelegate,列出返回标记)
{ 
foreach(returnTags中的IAsyncResult returnTag){
MessageType message=runRemoteCmdDlg.EndInvoke(returnTag);
messages.Add(消息)
} 
}
有许多类包含相同的代码,但都具有不同的委托类型

我想将MonitorTasks方法“拉”到基类中,但它需要处理所有不同类型的委托,例如:

private void MonitorTasks(Delegate theDelegate, List<IAsyncResult> returnTags) 
{ 

        foreach (IAsyncResult returnTag in returnTags) {
            MessageType message = runRemoteCmdDlg.EndInvoke(returnTag);  // DOESN'T COMPILE
            messages.Add(message)
        } 
}
private void monitortask(委托Delegate,列出returnTags)
{ 
foreach(returnTags中的IAsyncResult returnTag){
MessageType message=runRemoteCmdDlg.EndInvoke(returnTag);//未编译
messages.Add(消息)
} 
}
我无法对基本委托(或MulticastDelegate)类型调用EndInvoke(),因此如何编写此方法?我是否需要以不同的方式处理这个问题


我正在使用C#3.5,那么是否有一些方法可以使用Func、Action等,并且仍然能够调用EndInvoke?

您可以使用反射来访问委托的
EndInvoke()
方法:

using System.Reflection;

private void MonitorTasks(Delegate theDelegate, List<IAsyncResult> returnTags) 
{ 
    MethodInfo endInvoke = theDelegate.GetType().GetMethod("EndInvoke",
        new Type[] { typeof(IAsyncResult) });
    foreach (IAsyncResult returnTag in returnTags) {
        MessageType message = (MessageType) endInvoke.Invoke(theDelegate,
            new object[] { returnTag });
        messages.Add(message);
    } 
}
使用系统反射;
私有无效监视任务(委托删除项,列出返回标记)
{ 
MethodInfo endInvoke=theDelegate.GetType().GetMethod(“endInvoke”,
新类型[]{typeof(IAsyncResult)};
foreach(returnTags中的IAsyncResult returnTag){
MessageType message=(MessageType)endInvoke.Invoke(delegate,
新对象[]{returnTag});
消息。添加(消息);
} 
}

请参阅,以了解有关此问题的更一般的“激发并忘记”处理方法。

您可以使用反射来访问委托的
EndInvoke()
方法:

using System.Reflection;

private void MonitorTasks(Delegate theDelegate, List<IAsyncResult> returnTags) 
{ 
    MethodInfo endInvoke = theDelegate.GetType().GetMethod("EndInvoke",
        new Type[] { typeof(IAsyncResult) });
    foreach (IAsyncResult returnTag in returnTags) {
        MessageType message = (MessageType) endInvoke.Invoke(theDelegate,
            new object[] { returnTag });
        messages.Add(message);
    } 
}
使用系统反射;
私有无效监视任务(委托删除项,列出返回标记)
{ 
MethodInfo endInvoke=theDelegate.GetType().GetMethod(“endInvoke”,
新类型[]{typeof(IAsyncResult)};
foreach(returnTags中的IAsyncResult returnTag){
MessageType message=(MessageType)endInvoke.Invoke(delegate,
新对象[]{returnTag});
消息。添加(消息);
} 
}
请参阅,以了解有关该问题的更一般的“先开火,然后忘记”处理方法