TaskScheduler.GetScheduledTasks Método
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Apenas para o suporte do depurador, gera um enumerável de instâncias Task atualmente na fila do Agendador aguardando ser executado.
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)
Retornos
Um enumerável que permite que um depurador percorra as tarefas atualmente na fila para este agendador.
- Atributos
Exceções
Este Agendador não é capaz de gerar uma lista de tarefas em fila no momento.
Comentários
Uma classe derivada de TaskScheduler implementa esse método para dar suporte à integração com depuradores. Esse método só será invocado pelo .NET Framework quando o depurador solicitar acesso aos dados. O enumerável retornado será percorrido por utilitários de depuração para acessar as tarefas atualmente enfileiradas neste agendador, permitindo que o depurador forneça uma representação dessas informações na interface do usuário.
É importante observar que, quando esse método é chamado, todos os outros threads no processo serão congelados. Portanto, é importante evitar a sincronização com outros threads que podem levar ao bloqueio. Se a sincronização for necessária e você não conseguir adquirir o bloqueio nesse método, deverá lançar uma exceção para que o depurador não bloqueie. O exemplo a seguir mostra uma abordagem possível em 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);
}}
Além disso, esse método e o enumerável retornado não devem modificar nenhum estado globalmente visível.
A enumerável retornada nunca deve ser nula. Se atualmente não houver tarefas enfileiradas, uma enumeração vazia deverá ser retornada.
Os desenvolvedores que estão implementando depuradores personalizados não devem chamar esse método diretamente, mas devem usar o método GetScheduledTasksForDebugger
wrapper interno em vez disso: internal Task[] GetScheduledTasksForDebugger()
. Esse método wrapper retorna uma matriz de tarefas em vez de uma enumerável. Para recuperar uma lista de agendadores ativos, use o método internal static TaskScheduler[] GetTaskSchedulersForDebugger()
interno. Esse método estático retorna uma matriz de todas as instâncias ativas TaskScheduler . Em seguida, você pode usar GetScheduledTasksForDebugger
em cada instância do agendador para recuperar sua lista de tarefas agendadas.