【问题标题】:Is there a way to tell which Tasks are currently running in Task Parallel Library?有没有办法告诉任务并行库中当前正在运行哪些任务?
【发布时间】:2010-12-05 19:27:27
【问题描述】:

我无法查看正在运行的任务。有 Task.Current 属性,但是如果有多个任务正在运行怎么办?有没有办法获取这类信息?

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

【问题讨论】:

  • 您需要以编程方式获取它,还是用于调试?如果是用于调试,您是否知道可用于任务的新调试视图?
  • 我想以编程方式处理它。我已经看到了新的调试视图,它们很棒,但在这种情况下不是我需要的。

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


【解决方案1】:

嗨,迈克,没有公开方式可以访问 TPL 中的待处理任务列表。使其可用于调试器的机制依赖于所有线程将在枚举时被冻结的事实,因此它不能在运行时使用。

是的,有一种内置方式可以在任务完成时收到通知。查看 Task.ContinueWith API。基本上,这个 API 会创建一个新任务,当目标任务完成时会启动该任务。

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

希望这会有所帮助。

侯赛因

【讨论】:

    【解决方案2】:

    您还可以通过反射获取当前正在运行的任务(或任务的父级):

    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】:

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

      您还需要将Taskfactory 与您的类的实例一起用作调度程序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多