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)
Возвращаемое значение
Перечисляемый объект, позволяющий отладчику перемещаться по задачам, которые находятся в очереди данного планировщика.
- Атрибуты
Исключения
Этому планировщику не удается создать список находящихся в данный момент в очереди задач.
Комментарии
Класс, производный от 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
для каждого экземпляра планировщика для получения списка запланированных задач.