Как запустить дочернюю задачу из parent, который вызывает элемент делегата из коллекции делегатов? - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь запустить дочерние задачи из родительских и Invoke() делегат из коллекции делегатов в разных задачах.Но VS показывает мне ошибку - «Делегат не содержит Invoke ...» Как мне запустить этот код?

public struct DataStruct {...}
public class DataClass {...}

public class UserClass
{
          public delegate DataStruct UserDelegateDS();
          public delegate DataClass UserDelegateDC();

          public DataStruct MethodDS()
          {
               return new DataStruct();
          }
          public DataClass MethodDC()
          {
               return new DataClass();
          }
          public void Worker(List<Delegate> delegateCollection)
          {
               Task<object> parent = new Task<object>(() =>
               {
                    var results = new object [delegateCollection.Count];

                    for (int i = 0; i < results.Length; i++)
                    {
                         new Task(() => results[i] = delegateCollection[i].Invoke(), TaskCreationOptions.AttachedToParent).Start();
                    }

                    return results;
               });

               var cwt = parent.ContinueWith(pTask => Show(pTask.Result));
               parent.Start();
          }
          void ShowResults(object item) 
          {
               var items = item as object [];
               foreach(var t in items) {...}
          }
          public void Main()
          {
               List<Delegate> delegateCollection = new List<Delegate>();
               UserDelegateDS ds = MethodDS;
               UserDelegateDC dc = MethodDC;
               delegateCollection.Add(ds);
               delegateCollection.Add(dc);
               Worker(delegateCollection);
          }
}

проблема screen_from_VS вМетод Worker ():

new Task(() => results[i] = delegateCollection[i].Invoke(), TaskCreationOptions.AttachedToParent).Start();

1 Ответ

1 голос
/ 22 мая 2019

Поскольку тип Delegate не указывает сигнатуру функции, необходимо использовать фактический тип делегата для Invoke со строгим типом.

Рассмотрите возможность использования только одного типа делегата, который имеет тип возврата object (для которого рекомендуется System.Func<object>), и обертывание функций как ()=>MethodDS() при назначении делегату такого типа.

Или, если вы принимаете значительно более низкую производительность, вы можете просто позвонить DynamicInvoke() с недельным типом вместо Invoke() для типа Delegate

...