Lingua

JoinableTaskContext Classe

Definizione

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