首页 新闻 会员 周边 捐助

.NET Core 中如何知道一个 Task 所对应的方法名称

0
悬赏园豆:100 [已解决问题] 解决于 2019-04-16 14:07

请问 .NET Core 中如何知道一个 Task 所对应的方法名称?

比如下面的 C# 代码:

class Program
{
    static void Main(string[] args)
    {
        var task = RequestCnblogsQ();
    }

    private static async Task RequestCnblogsQ()
    {
        await new HttpClient().GetAsync("https://q.cnblogs.com/");
    }
}

如何通过 task 知道其对应的方法名称 RequestCnblogsQ ?

dudu的主页 dudu | 高人七级 | 园豆:30775
提问于:2019-04-15 21:49
< >
分享
最佳答案
1
收获园豆:100
沈星繁 | 小虾三级 |园豆:1096 | 2019-04-16 09:15

通过回答中的方法,反射拿到的 m_action 值总是 null

var task = RequestCnblogsQ();
var fieldInfo = typeof(Task).GetField("m_action", BindingFlags.Instance | BindingFlags.NonPublic);
var action = fieldInfo.GetValue(task);
dudu | 园豆:30775 (高人七级) | 2019-04-16 12:00

@dudu: 一旦 Task 运行完毕,m_action 就是 null 了,可以改成这样:

Task t = new Task<Task>(DoSomething);

var fieldInfo = typeof(Task).GetField("m_action", BindingFlags.Instance | BindingFlags.NonPublic);
Delegate action = fieldInfo.GetValue(t) as Delegate;
Console.WriteLine(action.Method.Name);

t.Start();
沈星繁 | 园豆:1096 (小虾三级) | 2019-04-16 13:15

@沈星繁: t.Start() 会抛异常:

Unhandled Exception: System.InvalidOperationException: Start may not be called on a task that hascompleted.
   at System.Threading.Tasks.Task.Start(TaskScheduler scheduler)
dudu | 园豆:30775 (高人七级) | 2019-04-16 13:40

@dudu:

先把 Task new 出来(此时没有运行里面的方法),取方法名(可能是用来写 Log 的?),再运行 Task。

我的测试代码是这样的,运行是没有问题的:

using System;
using System.Net.Http;
using System.Reflection;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var task = new Task<Task>(RequestCnblogsQ);

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

            task.Start();
        }

        private static async Task RequestCnblogsQ()
        {
            await new HttpClient().GetAsync("https://q.cnblogs.com/");
        }
    }
}
沈星繁 | 园豆:1096 (小虾三级) | 2019-04-16 13:51

@沈星繁: 赞!的确可以

dudu | 园豆:30775 (高人七级) | 2019-04-16 14:07
其他回答(1)
0

没有办法,找到办法了告诉我一下。。。。

博学多思 | 园豆:76 (初学一级) | 2019-04-16 08:33

见最佳答案

支持(0) 反对(0) dudu | 园豆:30775 (高人七级) | 2019-04-16 14:11
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册