Lenguaje

JoinableTaskContext Clase

Definición

Un contexto común en el que se pueden crear tareas que se pueden unir e interactuar para evitar interbloqueos.

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
Herencia
JoinableTaskContext
Implementaciones

Comentarios

Hay tres reglas que deben seguirse estrictamente al usar o interactuar con JoinableTasks: 1. Si un método tiene determinados requisitos de apartamento de subprocesos (STA o MTA), debe: a) Tener una firma asincrónica y serializar de forma asincrónica al subproceso adecuado si no se invoca originalmente en un subproceso compatible. La manera recomendada de cambiar al subproceso principal es:

await JoinableTaskFactory.SwitchToMainThreadAsync();

b) Tener una firma sincrónica y producir una excepción cuando se llama a en el subproceso incorrecto. En concreto, no se permite que ningún método serialice de forma sincrónica el trabajo en otro subproceso (bloqueando mientras se realiza ese trabajo). Los bloques sincrónicos en general deben evitarse siempre que sea posible. 2. Cuando una implementación de una API pública ya enviada debe llamar al código asincrónico y bloquear para su finalización, debe hacerlo siguiendo este patrón sencillo:

JoinableTaskFactory.Run(async delegate {
    await SomeOperationAsync(...);
});
  1. Si alguna vez espera el trabajo que se inició anteriormente, ese trabajo debe estar unido. Por ejemplo, un servicio inicia algún trabajo asincrónico que posteriormente puede bloquearse sincrónicamente:
JoinableTask longRunningAsyncWork = JoinableTaskFactory.RunAsync(async delegate {
    await SomeOperationAsync(...);
});

Después, ese trabajo asincrónico se vuelve bloqueado:

longRunningAsyncWork.Join();

o quizás:

await longRunningAsyncWork;

Tenga en cuenta, sin embargo, que este paso adicional no es necesario cuando se realiza la espera inmediatamente después de iniciar una operación asincrónica.

Constructores

Nombre Description
JoinableTaskContext()

Inicializa una nueva instancia de la JoinableTaskContext clase suponiendo que el subproceso actual es el subproceso principal y Current proporcionará los medios para cambiar al subproceso principal desde otro subproceso.

JoinableTaskContext(Thread, SynchronizationContext)

Inicializa una nueva instancia de la clase JoinableTaskContext.

Propiedades

Nombre Description
Factory

Obtiene el generador que crea tareas que se pueden combinar que no pertenecen a una colección de tareas que se puede combinar.

IsNoOpContext

Obtiene un valor que indica si esta instancia no está asociada a ningún subproceso principal (por ejemplo, creado con CreateNoOpContext()).

IsOnMainThread

Obtiene un valor que indica si el autor de la llamada se está ejecutando en el subproceso principal.

IsWithinJoinableTask

Obtiene un valor que indica si el autor de la llamada se está ejecutando actualmente en el contexto de una tarea que se puede unir.

MainThread

Obtiene el subproceso principal que se puede compartir mediante tareas creadas por este contexto.

NoMessagePumpSynchronizationContext

Obtiene un SynchronizationContext que, cuando se aplica, suprime cualquier bomba de mensajes que se pueda ejecutar durante bloques sincrónicos del subproceso de llamada.

Métodos

Nombre Description
Capture()

Captura el contexto del autor de la llamada y lo serializa como una cadena que es adecuada para la aplicación a través de una llamada posterior a RunAsync(Func<Task>, String, JoinableTaskCreationOptions).

CreateCollection()

Crea una colección para tareas que se pueden unir en curso.

CreateDefaultFactory()

Crea un generador sin JoinableTaskCollection.

CreateFactory(JoinableTaskCollection)

Crea un generador de tareas que se puede combinar que agrega automáticamente todas las tareas creadas a una colección que se puede unir conjuntamente.

CreateNoOpContext()

Inicializa una nueva instancia de la JoinableTaskContext clase configurada para no-op en llamadas a SwitchToMainThreadAsync(CancellationToken).

Dispose()

Un contexto común en el que se pueden crear tareas que se pueden unir e interactuar para evitar interbloqueos.

Dispose(Boolean)

Elimina los recursos administrados y no administrados mantenidos por esta instancia.

GetHangReport()

Contribuye a los datos de un informe de bloqueo.

IsMainThreadBlocked()

Obtiene un valor que indica si el subproceso principal está bloqueado para la finalización del autor de la llamada.

IsMainThreadMaybeBlocked()

Obtiene un valor muy probable si el subproceso principal está bloqueado para la finalización del autor de la llamada. Es menos preciso cuando la tarea de bloqueo de subprocesos de la interfaz de usuario se inicia y aún no se ha bloqueado, o la cadena de dependencias se acaba de quitar. Sin embargo, a diferencia IsMainThreadBlocked()de , esta implementación está libre de bloqueos y es más rápida en escenarios de contención alta.

OnFalseHangDetected(TimeSpan, Guid)

Se invoca cuando un informe de bloqueo anterior es una alarma falsa.

OnHangDetected(TimeSpan, Int32, Guid)

Se invoca cuando se sospecha que se ha producido un bloqueo que implica el subproceso principal.

SuppressRelevance()

Oculta cualquier joinableTask al que se asocia el autor de la llamada hasta que se elimina el valor devuelto.

Implementaciones de interfaz explícitas

Nombre Description
IHangReportContributor.GetHangReport()

Contribuye a los datos de un informe de bloqueo.

Se aplica a

Seguridad para subprocesos

Este tipo es seguro para subprocesos para todos los miembros.