TaskScheduler.GetScheduledTasks Método

Definição

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

IEnumerable<Task>

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.

Aplica-se a

Confira também