Я унаследовал какой-то многословный, повторяющийся код, который я пытаюсь реорганизовать.Вот лишь некоторые из них:
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)
}
}
Есть много классов, содержащих один и тот же код, но все с разными типами делегатов.
Я хотел бы «поднять» 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)
}
}
Я не могу вызвать EndInvoke () для базового типа Delegate (или MulticastDelegate),так как я могу кодировать этот метод?Нужно ли подходить к этому по-другому?
Я использую C # 3.5, так есть ли какой-нибудь способ использовать Func, Action и т. Д., И при этом иметь возможность вызывать EndInvoke?