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 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(...);
});
- 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.