在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任务本身之外注册所需的所有信息,并使用它来记录状态.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。