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 è possibile creare attività joinable 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
Quando si usa o interagisce con JoinableTasks, è necessario seguire rigorosamente tre regole: 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 su 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(...);
});
- Se mai in attesa di lavoro avviato in precedenza, il lavoro deve essere Unito. Ad esempio, un servizio avvia alcune operazioni asincrone che potrebbero diventare in seguito 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
| Nome | Descrizione |
|---|---|
| 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à
| Nome | Descrizione |
|---|---|
| Factory |
Ottiene la factory che crea attività joinable che non appartengono a una raccolta di attività joinable. |
| IsNoOpContext |
Ottiene un valore che indica se questa istanza non è associata ad alcun thread principale, ad esempio creato con CreateNoOpContext(). |
| 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 message pump che può essere eseguito durante blocchi sincroni del thread chiamante. |
Metodi
| Nome | Descrizione |
|---|---|
| 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 anteprima. |
| CreateDefaultFactory() |
Crea una factory senza un oggetto JoinableTaskCollection. |
| CreateFactory(JoinableTaskCollection) |
Crea una factory di attività joinable che aggiunge automaticamente tutte le attività create a una raccolta che può essere unita in join. |
| CreateNoOpContext() |
Inizializza una nuova istanza della JoinableTaskContext classe configurata per no-op nelle chiamate a SwitchToMainThreadAsync(CancellationToken). |
| Dispose() |
Contesto comune in cui è possibile creare attività joinable e interagire per evitare deadlock. |
| Dispose(Boolean) |
Elimina le risorse gestite e non gestite mantenute da questa istanza. |
| GetHangReport() |
Contribuisce ai dati per un report 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 appena avviata e non è stata ancora bloccata o la catena di dipendenze viene semplicemente 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() |
Nasconde qualsiasi JoinableTask a cui il chiamante è associato fino a quando il valore restituito non viene eliminato. |
Implementazioni dell'interfaccia esplicita
| Nome | Descrizione |
|---|---|
| IHangReportContributor.GetHangReport() |
Contribuisce ai dati per un report di blocco. |
Si applica a
Thread safety
Questo tipo è thread-safe per tutti i membri.