JoinableTaskContext Classe
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Contesto comune in cui le attività joinable possono essere create e interagire per evitare deadlock.
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
- Ereditarietà
-
JoinableTaskContext
- Implementazioni
Commenti
Esistono tre regole da seguire rigorosamente quando si usa o interagisce con JoinableTasks: 1. Se un metodo ha determinati requisiti per apartment di thread (STA o MTA) deve: a) Avere una firma asincrona e effettuare il marshalling asincrono al thread appropriato se non viene originariamente richiamato su un thread compatibile. Il modo consigliato per passare al thread principale è:
await JoinableTaskFactory.SwitchToMainThreadAsync();
b) Avere una firma sincrona e generare un'eccezione quando viene chiamato sul thread errato. In particolare, non è consentito alcun metodo per effettuare il marshalling sincrono a un altro thread (blocco mentre il lavoro viene eseguito). I blocchi sincroni in generale devono essere evitati quando possibile. 2. Quando un'implementazione di un'API pubblica già fornita deve chiamare codice asincrono e bloccarne il completamento, deve farlo seguendo questo semplice modello:
JoinableTaskFactory.Run(async delegate {
await SomeOperationAsync(...);
});
- In caso di attesa del lavoro avviato in precedenza, il lavoro deve essere Unito. Ad esempio, un servizio avvia alcune operazioni asincrone che in un secondo momento diventano bloccanti in modo sincrono:
JoinableTask longRunningAsyncWork = JoinableTaskFactory.RunAsync(async delegate {
await SomeOperationAsync(...);
});
Successivamente il lavoro asincrono diventa bloccato:
longRunningAsyncWork.Join();
o forse:
await longRunningAsyncWork;
Si noti tuttavia che questo passaggio aggiuntivo non è necessario quando l'attesa viene eseguita immediatamente dopo l'avvio di un'operazione asincrona.
Costruttori
JoinableTaskContext() |
Inizializza una nuova istanza della JoinableTaskContext classe presupponendo che il thread corrente sia il thread principale e Current fornirà i mezzi per passare al thread principale da un altro thread. |
JoinableTaskContext(Thread, SynchronizationContext) |
Inizializza una nuova istanza della classe JoinableTaskContext. |
Proprietà
Factory |
Ottiene la factory che crea attività joinable che non appartengono a una raccolta di attività joinable. |
IsOnMainThread |
Ottiene un valore che indica se il chiamante è in esecuzione nel thread principale. |
IsWithinJoinableTask |
Ottiene un valore che indica se il chiamante è attualmente in esecuzione all'interno del contesto di un'attività joinable. |
MainThread |
Ottiene il thread principale che può essere condiviso dalle attività create da questo contesto. |
NoMessagePumpSynchronizationContext |
Ottiene un oggetto SynchronizationContext che, se applicato, elimina qualsiasi pompa di messaggi che può essere eseguita durante blocchi sincroni del thread chiamante. |
Metodi
Capture() |
Acquisisce il contesto del chiamante e lo serializza come stringa adatta all'applicazione tramite una chiamata successiva a RunAsync(Func<Task>, String, JoinableTaskCreationOptions). |
CreateCollection() |
Crea una raccolta per le attività joinable in corso. |
CreateDefaultFactory() |
Crea una factory senza un JoinableTaskCollection. |
CreateFactory(JoinableTaskCollection) |
Crea una factory delle attività joinable che consente di aggiungere automaticamente tutte le attività create a una raccolta di cui è possibile creare congiuntamente un join. |
Dispose() |
Contesto comune in cui le attività joinable possono essere create e interagire per evitare deadlock. |
Dispose(Boolean) |
Elimina le risorse gestite e non gestite mantenute da questa istanza. |
GetHangReport() |
Fornisce i dati per un rapporto di blocco. |
IsMainThreadBlocked() |
Ottiene un valore che indica se il thread principale è bloccato per il completamento del chiamante. |
IsMainThreadMaybeBlocked() |
Ottiene un valore molto probabile se il thread principale è bloccato per il completamento del chiamante. È meno accurato quando l'attività di blocco del thread dell'interfaccia utente viene avviata e non è ancora stata bloccata o la catena di dipendenze viene appena rimossa. Tuttavia, a differenza IsMainThreadBlocked()di , questa implementazione è priva di blocchi e più veloce in scenari di contesa elevata. |
OnFalseHangDetected(TimeSpan, Guid) |
Richiamato quando un report di blocco precedente è falso allarme. |
OnHangDetected(TimeSpan, Int32, Guid) |
Richiamato quando si sospetta che si sia verificato un blocco che coinvolge il thread principale. |
SuppressRelevance() |
Consente di nascondere qualsiasi JoinableTask associato al chiamante fino a quando non viene eliminato il valore restituito. |
Implementazioni dell'interfaccia esplicita
IHangReportContributor.GetHangReport() |
Fornisce i dati per un rapporto di blocco. |
Si applica a
Thread safety
Questo tipo è thread-safe per tutti i membri.