我无法看到查看正在运行的任务的方法。有Task.Current属性,但是如果有多个任务在运行呢?有没有办法获得这种信息?
或者,是否有内置的方法可以在任务开始或完成时收到通知?
答案 0 :(得分:3)
嘿Mike,没有公开的方式来访问TPL中的待处理任务列表。使其可用于调试器的机制依赖于以下事实:所有线程将在枚举时冻结,因此无法在运行时使用。
是的,有一种内置的方式可以在任务完成时获得通知。查看Task.ContinueWith API。基本上,此API会创建一个新任务,该任务将在目标任务完成时触发。
我假设您希望根据此进行快速记帐/进度报告,如果是这种情况,我建议您使用TaskContinuationOptions.ExecuteSynchronously标志调用task.ContinueWith()。当您指定在目标任务完成时将在同一线程上运行延续操作时(如果您未指定此项,则延续任务将像任何其他常规任务一样排队)。
希望这有帮助。
侯赛因
答案 1 :(得分:3)
您还可以使用反射获取当前正在运行的任务(或任务的父级):
static public class Extensions
{
public static Task Parent(this Task t)
{
FieldInfo info = typeof(Task).GetField("m_parent",
BindingFlags.NonPublic | BindingFlags.Instance);
return info != null ? (Task)info.GetValue(t) : null;
}
public static Task Self
{
get
{
return Task.Factory.StartNew(
() => { },
CancellationToken.None,
TaskCreationOptions.AttachedToParent,
TaskScheduler.Default).Parent();
}
}
};
答案 2 :(得分:2)
您可以创建一个源自提供的TaskScheduler
类。在该类中,您可以完全控制并可以在执行的任一侧添加日志记录。例如,请参阅:http://msdn.microsoft.com/en-us/library/ee789351.aspx
您还需要使用Taskfactory
作为调度程序的类实例。