代码之家  ›  专栏  ›  技术社区  ›  Mike Two

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

  •  4
  • Mike Two  · 技术社区  · 16 年前

    或者,是否有一种内置的方式在任务开始或完成时获得通知?

    3 回复  |  直到 13 年前
        1
  •  3
  •   HYildiz    16 年前

    嘿,Mike,在TPL中没有公开的方式访问挂起的任务列表。使其可用于调试器的机制依赖于以下事实:所有线程都将在枚举时冻结,因此无法在运行时使用。

    是的,有一种内置的方法可以在任务完成时获得通知。查看Task.continueWithAPI。基本上,这个API创建了一个新任务,当目标任务完成时将启动该任务。

    我假设您希望在此基础上进行一些快速记帐/进度报告,如果是这样,我建议您使用TaskContinuationOptions.ExecuteSynchronously标志调用task.ContinueWith()。当指定目标任务完成时,继续操作将在同一线程上运行(如果未指定此选项,则继续任务将像其他常规任务一样排队)。

    希望这有帮助。

    胡赛因

        2
  •  3
  •   Glenn Slayden    15 年前

    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();
            }
        }
    };
    
        3
  •  2
  •   Ian Mercer    15 年前

    您可以创建一个 TaskScheduler 从提供的类派生的类。在该类中,您拥有完全控制权,可以在执行的任意一侧添加日志记录。例如,见: http://msdn.microsoft.com/en-us/library/ee789351.aspx

    您还需要使用 Taskfactory