TaskScheduler.GetScheduledTasks Método

Definição

Somente para suporte ao depurador, gera uma enumerável de Task instâncias atualmente enfileiradas no agendador aguardando a execução.

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();
[<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 enfileiradas para esse agendador.

Atributos

Exceções

Esse agendador não consegue gerar uma lista de tarefas enfileiradas 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 pela depuração de utilitários 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 for chamado, todos os outros threads no processo serão congelados. Portanto, é importante evitar a sincronização com outros threads que possam levar ao bloqueio. Se a sincronização for necessária e você não conseguir adquirir o bloqueio nesse método, você 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 visível globalmente.

A enumerável retornada nunca deve ser nula. Se atualmente não houver tarefas enfileiradas, uma enumerável 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