JoinableTaskContext Clase
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
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(...);
});
- 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.