TaskScheduler.GetScheduledTasks Метод

Определение

Создает перечисляемый объект экземпляров 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)

Возвращаемое значение

IEnumerable<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 для каждого экземпляра планировщика для получения списка запланированных задач.

Применяется к

См. также раздел