从C#中的Task获取操作

Chr*_*uer 7 .net c# task task-parallel-library

Task在C#中实例化了一个或多个对象,例如:

var tasks = new List<Task>
{
    Task.Factory.StartNew(MyWorker.DoWork),
    Task.Factory.StartNew(AnotherWorker.DoOtherWork)
};
Run Code Online (Sandbox Code Playgroud)

有没有办法Action从任务对象中获取方法?换句话说,我可以返回Action的MyWorker.DoWork从它的任务是什么?

我正在尝试记录每个任务的状态,如下所示:

Task.WaitAll(tasks.ToArray(), new TimeSpan(0, 0, 1));

var msg = tasks.Aggregate(string.Empty,
    (current, task) =>
        current + $"{task.Action}: {task.Status}{Environment.NewLine}");
Run Code Online (Sandbox Code Playgroud)

字符串值msg将是:

MyWorker.DoWork RanToCompletion
AnotherWorker.DoOtherWork Running
Run Code Online (Sandbox Code Playgroud)

({task.Action}我的样本部分不存在,当然也不会编译)

i3a*_*non 8

委托存储在类的m_action数据成员中Task.您可以在参考源中看到它.

但是,该数据成员是internal并且没有公开的方式来实现它.但是,您可以使用反射来选择任务的内部并查看其中的内容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);
Run Code Online (Sandbox Code Playgroud)

输出(在我的具体示例中):

Void Foo()
Run Code Online (Sandbox Code Playgroud)

更好的设计选项是从代码中的单个位置启动所有任务,这些任务会记录您在Task自身之外所需的所有信息,并使用它来记录状态.