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