TaskScheduler.GetScheduledTasks 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
仅对于调试器支持,生成当前排队到计划程序中等待执行的 Task 实例的枚举。
protected:
abstract System::Collections::Generic::IEnumerable<System::Threading::Tasks::Task ^> ^ GetScheduledTasks();
[System.Security.SecurityCritical]
protected abstract System.Collections.Generic.IEnumerable<System.Threading.Tasks.Task> GetScheduledTasks ();
protected abstract System.Collections.Generic.IEnumerable<System.Threading.Tasks.Task>? GetScheduledTasks ();
protected abstract System.Collections.Generic.IEnumerable<System.Threading.Tasks.Task> GetScheduledTasks ();
[<System.Security.SecurityCritical>]
abstract member GetScheduledTasks : unit -> seq<System.Threading.Tasks.Task>
abstract member GetScheduledTasks : unit -> seq<System.Threading.Tasks.Task>
Protected MustOverride Function GetScheduledTasks () As IEnumerable(Of Task)
返回
一个允许调试器遍历当前排队到此计划程序中的任务的枚举。
- 属性
例外
此计划程序无法在此时生成排队任务的列表。
注解
派生自 TaskScheduler 实现此方法的类,以支持与调试器的集成。 仅当调试器请求访问数据时,.NET Framework才会调用此方法。 返回的可枚举将通过调试实用工具遍历,以访问当前排队到此计划程序的任务,使调试器能够在用户界面中提供此信息的表示形式。
请务必注意,调用此方法时,进程中的所有其他线程都将冻结。 因此,请务必避免与其他可能导致阻塞的线程同步。 如果需要同步,并且无法获取此方法中的锁,则应引发异常,以便调试器不会阻止。 以下示例显示了 C# 中的一种可能方法:
protected override IEnumerable<Task> GetScheduledTasks()
{
bool lockTaken = false;
try
{
Monitor.TryEnter(_syncObj, ref lockTaken);
if (lockTaken)
{
return _tasks.ToArray();
}
else throw new NotSupportedException();
}
finally
{
if (lockTaken) Monitor.Exit(_syncObj);
}}
此外,此方法和返回的可枚举项不得修改任何全局可见状态。
返回的枚举不应为 null。 如果当前没有排队的任务,应改为返回空枚举。
实现自定义调试器的开发人员不应直接调用此方法,而是应改用内部包装器方法GetScheduledTasksForDebugger
: internal Task[] GetScheduledTasksForDebugger()
此包装器方法返回任务数组,而不是可枚举的数组。 若要检索活动计划程序的列表,请使用内部方法 internal static TaskScheduler[] GetTaskSchedulersForDebugger()
。 此静态方法返回所有活动 TaskScheduler 实例的数组。 然后 GetScheduledTasksForDebugger
,可以在每个计划程序实例上使用,以检索其计划任务列表。