JoinableTaskContext Classe
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
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(...);
});
- 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.