加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

从C#中的Task获取操作

发布时间:2020-12-15 08:47:25 所属栏目:百科 来源:网络整理
导读:在C#中实例化了一个或多个Task对象,例如: var tasks = new ListTask{ Task.Factory.StartNew(MyWorker.DoWork),Task.Factory.StartNew(AnotherWorker.DoOtherWork)}; 有没有办法从任务对象中获取Action方法?换句话说,我可以从其任务中返回MyWorker.DoWork
在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,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}部分不存在,当然也不会编译)

解决方法

委托存储在Task类的m_action数据成员中.你可以在 reference source中看到.

但是,该数据成员是内部的,并且没有公开的方式来实现它.但是,您可以使用反射来选择任务的内部并查看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任务本身之外注册所需的所有信息,并使用它来记录状态.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读