我正在尝试从父级启动子任务,并从不同任务中的代表集合中启动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();
答案 0 :(得分:1)
由于类型Delegate
未指定任何函数签名,因此您需要对具有强类型的Invoke
使用实际的委托类型。
仅考虑使用一种返回类型为object
(建议使用System.Func<object>
的委托类型),并在分配给此类委托时将其包装为类似()=>MethodDS()
类型。
或者,如果您接受明显降低的性能,则可以简单地以周类型调用DynamicInvoke()
,而不是类型Invoke()
的{{1}}