Compartilhar via


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 realizar 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 main é:

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 realizar marshaling de trabalho de forma síncrona para outro thread (bloqueando enquanto esse trabalho é feito). 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 para 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 iniciado anteriormente, esse trabalho deverá ser Ingressado. Por exemplo, um serviço inicia algum trabalho assíncrono que posteriormente pode se tornar um bloqueio síncrono:
JoinableTask longRunningAsyncWork = JoinableTaskFactory.RunAsync(async delegate {
    await SomeOperationAsync(...);
});

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

longRunningAsyncWork.Join();

ou talvez:

await longRunningAsyncWork;

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

Construtores

JoinableTaskContext()

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

JoinableTaskContext(Thread, SynchronizationContext)

Inicializa uma nova instância da classe JoinableTaskContext.

Propriedades

Factory

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

IsOnMainThread

Obtém um valor que indica se o chamador está em execução no thread main.

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 main 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

Capture()

Captura o contexto do chamador e o serializa 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 andamento.

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.

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 de main está bloqueado para a conclusão do chamador.

IsMainThreadMaybeBlocked()

Obtém um valor muito provável se o thread main 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ências é removida. No entanto, ao contrário IsMainThreadBlocked()de , essa implementação é livre de bloqueios e mais rápida em cenários de alta contenção.

OnFalseHangDetected(TimeSpan, Guid)

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

OnHangDetected(TimeSpan, Int32, Guid)

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

SuppressRelevance()

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

Implantações explícitas de interface

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.