Compartir a través de


JoinableTaskContext Clase

Definición

Un contexto común en el que las tareas joinable se pueden crear 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 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 su finalización, debe hacerlo siguiendo este patrón simple:

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 más adelante puede bloquearse sincrónicamente:
JoinableTask longRunningAsyncWork = JoinableTaskFactory.RunAsync(async delegate {
    await SomeOperationAsync(...);
});

Después, ese trabajo asincrónico se bloquea:

longRunningAsyncWork.Join();

o quizás:

await longRunningAsyncWork;

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

Constructores

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

Factory

Obtiene el generador que crea tareas joinable que no pertenecen a una colección joinable de la tarea.

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 combinar.

MainThread

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

NoMessagePumpSynchronizationContext

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

Métodos

Capture()

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

CreateCollection()

Crea una colección para las tareas joinable en curso.

CreateDefaultFactory()

Crea un generador sin JoinableTaskCollection.

CreateFactory(JoinableTaskCollection)

Crea un generador joinable de tarea que agrega automáticamente todas las tareas creadas a una colección que se puede unir de forma conjunta.

Dispose()

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

Dispose(Boolean)

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

GetHangReport()

Aporta datos para 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 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 es sin 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 en el subproceso principal.

SuppressRelevance()

Oculta cualquier JoinableTask que se asocia con el llamador hasta que se deseche el valor devuelto.

Implementaciones de interfaz explícitas

IHangReportContributor.GetHangReport()

Aporta datos para un informe de bloqueo.

Se aplica a

Seguridad para subprocesos

Este tipo es seguro para subprocesos para todos los miembros.