获取任务的方法名称

我希望从C#中的任务中获取方法/操作名称。 具体来说,我正在实现一个自定义任务调度程序,并希望生成有关任务运行持续时间的统计信息,然后我将通过在任务内部运行的方法进行聚合。 在visual studio调试器中,您可以访问它并查看m_action私有变量以及调试器显示注释,并将其显示为Method = {0}。 有没有办法从任务本身访问这个?

好吧,在给定Task变量task ,您可以使用reflection来获取私有m_action字段:

  var fieldInfo = typeof(Task).GetField("m_action", BindingFlags.Instance | BindingFlags.NonPublic); Delegate action = fieldInfo.GetValue(task) as Delegate; 

然后获取方法的NameDeclaringType

  var name = action.Method.Name; var type = action.Method.DeclaringType.FullName; 

要获得完全限定的方法( type + "." + name )…

但是,只要任务执行完成, m_action就为null 。 我不确定这将如何适用于TaskFactory.StartNew …

您可以从Taskinheritance以使其变得非常容易……我将在这里为该示例实现第一个构造函数:

 public class NamedTask : Task { public string MethodName { get; set; } public NamedTask(Action action) : base(action) { MethodName = action.Method.Name; } public NamedTask(Action action, CancellationToken cancellationToken) : base(action, cancellationToken) {} public NamedTask(Action action, TaskCreationOptions creationOptions) : base(action, creationOptions) {} public NamedTask(Action action, CancellationToken cancellationToken, TaskCreationOptions creationOptions) : base(action, cancellationToken, creationOptions) {} public NamedTask(Action action, object state) : base(action, state) {} public NamedTask(Action action, object state, CancellationToken cancellationToken) : base(action, state, cancellationToken) {} public NamedTask(Action action, object state, TaskCreationOptions creationOptions) : base(action, state, creationOptions) {} public NamedTask(Action action, object state, CancellationToken cancellationToken, TaskCreationOptions creationOptions) : base(action, state, cancellationToken, creationOptions) {} } 

之后…

 NamedTask task = new NamedTask(() => AsyncMethod(arg1, arg2, argN)); string methodName = task.MethodName; // there's the name! 

更多例子。 从Taskinheritance:

 public class NamedTask : Task { public string MethodName { get; set; } public NamedTask(Func function) : base(function) { MethodName = function.Method.Name; } public NamedTask(Func function, string methodName) : base(function) { MethodName = methodName; } ... } 

处理匿名方法:

 NamedTask task2 = new NamedTask(() => { // some arbitrary code return true; }); NamedTask task3 = new NamedTask(() => { // some arbitrary code return true; }, "ReturnTrueMethod"); string methodName2 = task2.MethodName; // returns "b__19" string methodName3 = task3.MethodName; // returns "ReturnTrueMethod" 
  1. 尝试reflection以获取m_action变量。
  2. 尝试从任务内部从Envorinment.StackTrace获取信息或直接从它调用方法。