TaskScheduler.GetScheduledTasks Método
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Para suporte apenas de depuradores, gera um número incontável de Task instâncias atualmente enfileiradas no escalonador à espera de serem executadas.
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)
Devoluções
Um enumerável que permite a um depurador percorrer as tarefas atualmente enfileiradas neste agendador.
- Atributos
Exceções
Este escalonador não consegue gerar uma lista de tarefas em fila neste momento.
Observações
Uma classe derivada de TaskScheduler implementa este método para suportar a integração com depuradores. Este método só será invocado pelo .NET Framework quando o depurador solicitar acesso aos dados. O enumerável retorno será percorrido por utilitários de depuração para aceder às tarefas atualmente enfileiradas neste escalonador, permitindo ao depurador fornecer uma representação desta informação na interface do utilizador.
É importante notar que, quando este método é chamado, todos os outros threads do processo ficam congelados. Por isso, é importante evitar a sincronização com outros threads que possam levar a bloqueios. Se a sincronização for necessária e não conseguir adquirir o bloqueio neste método, deve lançar uma exceção para que o depurador não bloqueie. O exemplo seguinte mostra uma possível abordagem 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, este método e o enumerável devolvido não devem modificar qualquer estado visível globalmente.
O enumerável devolvido nunca deve ser nulo. Se atualmente não houver tarefas em fila, deve ser devolvido um enumerável vazio.
Os programadores que implementam depuradores personalizados não devem chamar este método diretamente, mas sim usar o método GetScheduledTasksForDebugger do wrapper interno: internal Task[] GetScheduledTasksForDebugger(). Este método de wrapper devolve um array de tarefas em vez de um enumerável. Para recuperar uma lista de agendadores ativos, use o método internal static TaskScheduler[] GetTaskSchedulersForDebugger()interno . Este método estático devolve um array de todas as instâncias ativas TaskScheduler . Pode então usar GetScheduledTasksForDebugger em cada instância do escalonador para recuperar a sua lista de tarefas agendadas.