如何从父级运行从子代集合中调用子代项目的子任务?

时间:2019-05-22 07:20:38

标签: c# asynchronous delegates task

我正在尝试从父级启动子任务,并从不同任务中的代表集合中启动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);
          }
}

Worker()方法中的问题screen_from_VS

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

1 个答案:

答案 0 :(得分:1)

由于类型Delegate未指定任何函数签名,因此您需要对具有强类型的Invoke使用实际的委托类型。

仅考虑使用一种返回类型为object(建议使用System.Func<object>的委托类型),并在分配给此类委托时将其包装为类似()=>MethodDS()类型。

或者,如果您接受明显降低的性能,则可以简单地以周类型调用DynamicInvoke(),而不是类型Invoke()的{​​{1}}