Linguagem

JoinableTaskContext Classe

Definição

Um contexto comum no qual tarefas ingressáveis podem ser criadas e interagir para evitar deadlocks.

public ref class JoinableTaskContext : IDisposable, Microsoft::VisualStudio::Threading::IHangReportContributor
public class JoinableTaskContext : IDisposable, Microsoft.VisualStudio.Threading.IHangReportContributor
type JoinableTaskContext = class
    interface IHangReportContributor
    interface IDisposable
Public Class JoinableTaskContext
Implements IDisposable, IHangReportContributor
Herança
JoinableTaskContext
Implementações

Comentários

Há três regras que devem ser seguidas estritamente ao usar ou interagir com JoinableTasks: 1. Se um método tiver determinados requisitos de thread apartment (STA ou MTA), ele deverá: a) ter uma assinatura assíncrona e fazer marshaling assíncrono para o thread apropriado se ele não for originalmente invocado em um thread compatível. A maneira recomendada de alternar para o thread principal é:

await JoinableTaskFactory.SwitchToMainThreadAsync();

b) Tenha uma assinatura síncrona e gere uma exceção quando chamado no thread errado. Em particular, nenhum método tem permissão para fazer marshaling de trabalho de forma síncrona para outro thread (bloqueando enquanto esse trabalho é feito). Os blocos síncronos em geral devem ser evitados sempre que possível. 2. Quando uma implementação de uma API pública já enviada deve chamar código assíncrono e bloquear sua conclusão, ela deve fazer isso seguindo este padrão simples:

JoinableTaskFactory.Run(async delegate {
    await SomeOperationAsync(...);
});
  1. Se alguma vez aguardar o trabalho que foi iniciado anteriormente, esse trabalho deve ser Ingressado. Por exemplo, um serviço inicia algum trabalho assíncrono que mais tarde pode se tornar um bloqueio síncrono:
JoinableTask longRunningAsyncWork = JoinableTaskFactory.RunAsync(async delegate {
    await SomeOperationAsync(...);
});

Posteriormente, esse trabalho assíncrono se tornará um bloqueio:

longRunningAsyncWork.Join();

ou talvez:

await longRunningAsyncWork;

No entanto, observe que essa etapa extra não é necessária quando aguardar é feita imediatamente após iniciar uma operação assíncrona.

Construtores

Nome Description
JoinableTaskContext()

Inicializa uma nova instância da JoinableTaskContext classe supondo que o thread atual seja o thread principal e Current fornecerá os meios para alternar para o thread principal de outro thread.

JoinableTaskContext(Thread, SynchronizationContext)

Inicializa uma nova instância da classe JoinableTaskContext.

Propriedades

Nome Description
Factory

Obtém a fábrica que cria tarefas ingressáveis que não pertencem a uma coleção de tarefas ingressável.

IsNoOpContext

Obtém um valor que indica se essa instância não está associada a nenhum thread principal (por exemplo, criado com CreateNoOpContext()).

IsOnMainThread

Obtém um valor que indica se o chamador está sendo executado no thread principal.

IsWithinJoinableTask

Obtém um valor que indica se o chamador está em execução no momento dentro do contexto de uma tarefa ingressável.

MainThread

Obtém o thread principal que pode ser compartilhado por tarefas criadas por esse contexto.

NoMessagePumpSynchronizationContext

Obtém um SynchronizationContext que, quando aplicado, suprime qualquer bomba de mensagem que possa ser executada durante blocos síncronos do thread de chamada.

Métodos

Nome Description
Capture()

Captura o contexto do chamador e serializa-o como uma cadeia de caracteres adequada para o aplicativo por meio de uma chamada subsequente para RunAsync(Func<Task>, String, JoinableTaskCreationOptions).

CreateCollection()

Cria uma coleção para tarefas ingressáveis em pré-lançamento.

CreateDefaultFactory()

Cria uma fábrica sem um JoinableTaskCollection.

CreateFactory(JoinableTaskCollection)

Cria uma fábrica de tarefas ingressável que adiciona automaticamente todas as tarefas criadas a uma coleção que pode ser unida em conjunto.

CreateNoOpContext()

Inicializa uma nova instância da JoinableTaskContext classe configurada para no-op em chamadas para SwitchToMainThreadAsync(CancellationToken).

Dispose()

Um contexto comum no qual tarefas ingressáveis podem ser criadas e interagir para evitar deadlocks.

Dispose(Boolean)

Descarta recursos gerenciados e não gerenciados mantidos por essa instância.

GetHangReport()

Contribui com dados para um relatório de travamento.

IsMainThreadBlocked()

Obtém um valor que indica se o thread principal está bloqueado para a conclusão do chamador.

IsMainThreadMaybeBlocked()

Obtém um valor muito provável se o thread principal está bloqueado para a conclusão do chamador. É menos preciso quando a tarefa de bloqueio de thread da interface do usuário é iniciada e ainda não foi bloqueada ou a cadeia de dependência é removida. No entanto, ao contrário IsMainThreadBlocked(), essa implementação é livre de bloqueio e mais rápida em cenários de alta contenção.

OnFalseHangDetected(TimeSpan, Guid)

Invocado quando um relatório de travamento anterior é falso alarme.

OnHangDetected(TimeSpan, Int32, Guid)

Invocado quando suspeita-se que ocorreu um travamento envolvendo o thread principal.

SuppressRelevance()

Oculta qualquer JoinableTask ao qual o chamador está associado até que o valor retornado seja descartado.

Implantações explícitas de interface

Nome Description
IHangReportContributor.GetHangReport()

Contribui com dados para um relatório de travamento.

Aplica-se a

Acesso thread-safe

Esse tipo é thread-safe para todos os membros.