c# - 从 C# 中的任务获取操作

标签 c# .net task-parallel-library task

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

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

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

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

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/

相关文章:

c# - cecil : Instruction. Instruction.OpCode.Code值对应的操作数类型

c# - C# 中的 MySQL 内部连接语法错误

c# - 我的 WPF 应用程序的当前上下文中不存在名称 'InitializeComponent'

c# - Application.Current.MainPage 与 Navigation.PushAsync() 与 Navigation.PushModalAsync()

c# - Task 和 Task<T> 可以互换吗?

c# - 如何在 C++/CLI 中将事件处理程序分配给事件?

.net - 创建到 MySQL 的只读连接?

java - 覆盖与分配/解除分配——效率

c# - Task.WhenAll() 和 foreach(var task in tasks) 有什么区别

c# - C# 5.0 的异步等待功能与 TPL 有何不同?