在 C# 中实例化了一个或多个 Task
对象,例如:
var tasks = new List<Task>
{
Task.Factory.StartNew(MyWorker.DoWork),
Task.Factory.StartNew(AnotherWorker.DoOtherWork)
};
有没有办法从任务对象中获取Action
方法?换句话说,我可以从它的任务中返回 MyWorker.DoWork
的 Action
吗?
我正在尝试能够记录每个任务的状态,如下所示:
Task.WaitAll(tasks.ToArray(), new TimeSpan(0, 0, 1));
var msg = tasks.Aggregate(string.Empty,
(current, task) =>
current + $"{task.Action}: {task.Status}{Environment.NewLine}");
msg
的字符串值为:
MyWorker.DoWork RanToCompletion
AnotherWorker.DoOtherWork Running
(我的示例的 {task.Action}
部分不存在,当然不会编译)
最佳答案
委托(delegate)存储在Task
类的m_action
数据成员中。你可以在 reference source 中看到.
但是,该数据成员是内部的
并且没有公共(public)途径可以访问它。但是,您可以使用反射来进入任务的内部并查看 m_action
的内容。
例如这个:
var fooTask = new Task(Foo);
var fieldInfo = typeof(Task).GetField("m_action", BindingFlags.NonPublic | BindingFlags.Instance);
var value = fieldInfo.GetValue(fooTask);
Console.WriteLine(((Action)value).Method);
输出(在我的具体示例中):
Void Foo()
更好的设计选择是从代码中的一个位置开始所有任务,该位置注册了您在 Task
本身之外需要的所有信息,并使用它来记录状态。
关于c# - 从 C# 中的任务获取操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32128321/