有没有办法告诉任务并行库中当前正在运行哪些任务?

时间:2009-10-11 19:30:17

标签: .net-4.0 c#-4.0 task-parallel-library

我无法看到查看正在运行的任务的方法。有Task.Current属性,但是如果有多个任务在运行呢?有没有办法获得这种信息?

或者,是否有内置的方法可以在任务开始或完成时收到通知?

3 个答案:

答案 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作为调度程序的类实例。