Condividi tramite


JoinableTaskContext Classe

Definizione

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