4

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

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

4

3 回答 3

3

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

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

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

希望这可以帮助。

侯赛因

于 2009-10-29T22:15:45.783 回答
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();
        }
    }
};
于 2010-11-19T03:15:38.813 回答
2

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

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

于 2010-09-02T06:52:12.353 回答