我看不到查看哪些任务正在运行的方法。有 Task.Current 属性,但是如果有多个任务正在运行怎么办?有没有办法获得这种信息?
或者,是否有内置方法可以在任务开始或完成时获得通知?
我看不到查看哪些任务正在运行的方法。有 Task.Current 属性,但是如果有多个任务正在运行怎么办?有没有办法获得这种信息?
或者,是否有内置方法可以在任务开始或完成时获得通知?
嘿,迈克,没有公开的方式来访问 TPL 中的待处理任务列表。使其可用于调试器的机制依赖于所有线程将在枚举时冻结的事实,因此它不能在运行时使用。
是的,有一种内置方式可以在任务完成时收到通知。查看 Task.ContinueWith API。基本上,这个 API 会创建一个新任务,当目标任务完成时会启动它。
我假设您想在此基础上进行一些快速会计/进度报告,如果是这种情况,我建议您使用 TaskContinuationOptions.ExecuteSynchronously 标志调用 task.ContinueWith()。当您指定目标任务完成时继续操作将在同一线程上运行时(如果您未指定此选项,则继续任务将像任何其他常规任务一样排队)。
希望这可以帮助。
侯赛因
您还可以通过反射获取当前正在运行的任务(或任务的父级):
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();
}
}
};
您可以创建一个TaskScheduler
从提供的类派生的类。在该类中,您可以完全控制并且可以在执行的任一侧添加日志记录。参见例如:http: //msdn.microsoft.com/en-us/library/ee789351.aspx
您还需要将 aTaskfactory
与您的类的实例一起用作调度程序。