Sprache

JoinableTaskContext Klasse

Definition

Ein allgemeiner Kontext, in dem verknüpfungsfähige Aufgaben erstellt und interagiert werden können, um Deadlocks zu vermeiden.

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
Vererbung
JoinableTaskContext
Implementiert

Hinweise

Es gibt drei Regeln, die streng eingehalten werden sollten, wenn JoinableTasks verwendet oder mit JoinableTasks interagiert wird: 1. Wenn eine Methode bestimmte Thread-Apartmentanforderungen (STA oder MTA) hat, muss sie eine asynchrone Signatur haben und asynchron an den entsprechenden Thread marshallen, wenn sie ursprünglich nicht für einen kompatiblen Thread aufgerufen wird. Die empfohlene Methode zum Wechseln zum Hauptthread ist:

await JoinableTaskFactory.SwitchToMainThreadAsync();

b) Verwenden Sie eine synchrone Signatur, und lösen Sie eine Ausnahme aus, wenn sie für den falschen Thread aufgerufen wird. Insbesondere ist es nicht zulässig, synchrone Arbeit an einen anderen Thread zu marshallen (Blockierung während dieser Arbeit). Synchrone Blöcke sollten grundsätzlich vermieden werden, wenn möglich. 2. Wenn eine Implementierung einer bereits ausgelieferten öffentlichen API asynchronen Code aufrufen und für den Abschluss blockieren muss, muss dies durch Ausführen dieses einfachen Musters erfolgen:

JoinableTaskFactory.Run(async delegate {
    await SomeOperationAsync(...);
});
  1. Wenn sie jemals auf die zuvor begonnene Arbeit warten, muss diese Arbeit verknüpft sein. Beispielsweise startet ein Dienst einige asynchrone Arbeiten, die später synchron blockiert werden können:
JoinableTask longRunningAsyncWork = JoinableTaskFactory.RunAsync(async delegate {
    await SomeOperationAsync(...);
});

Später wird die asynchrone Arbeit blockiert:

longRunningAsyncWork.Join();

oder vielleicht:

await longRunningAsyncWork;

Beachten Sie jedoch, dass dieser zusätzliche Schritt beim Warten unmittelbar nach dem Starten eines asynchronen Vorgangs nicht erforderlich ist.

Konstruktoren

Name Beschreibung
JoinableTaskContext()

Initialisiert eine neue Instanz der JoinableTaskContext Klasse, vorausgesetzt, der aktuelle Thread ist der Hauptthread und Current stellt die Mittel bereit, um von einem anderen Thread zum Hauptthread zu wechseln.

JoinableTaskContext(Thread, SynchronizationContext)

Initialisiert eine neue Instanz der JoinableTaskContext-Klasse.

Eigenschaften

Name Beschreibung
Factory

Ruft die Factory ab, die verknüpfungsfähige Aufgaben erstellt, die nicht zu einer verknüpften Aufgabenauflistung gehören.

IsNoOpContext

Ruft einen Wert ab, der angibt, ob diese Instanz keinem Hauptthread zugeordnet ist (z. B. erstellt mit CreateNoOpContext()).

IsOnMainThread

Ruft einen Wert ab, der angibt, ob der Aufrufer im Hauptthread ausgeführt wird.

IsWithinJoinableTask

Ruft einen Wert ab, der angibt, ob der Aufrufer derzeit im Kontext einer verknüpfungsfähigen Aufgabe ausgeführt wird.

MainThread

Ruft den Hauptthread ab, der von Aufgaben freigegeben werden kann, die von diesem Kontext erstellt wurden.

NoMessagePumpSynchronizationContext

Ruft ein SynchronizationContext , das bei Anwendung alle Nachrichtenpumpe unterdrückt, die während synchroner Blöcke des aufrufenden Threads ausgeführt werden kann.

Methoden

Name Beschreibung
Capture()

Erfasst den Kontext des Aufrufers und serialisiert ihn als Zeichenfolge, die für die Anwendung über einen nachfolgenden Aufruf RunAsync(Func<Task>, String, JoinableTaskCreationOptions)geeignet ist.

CreateCollection()

Erstellt eine Auflistung für In-Flight-Aufgaben, die mit einer Verknüpfung verknüpft werden können.

CreateDefaultFactory()

Erstellt eine Factory ohne eine JoinableTaskCollection.

CreateFactory(JoinableTaskCollection)

Erstellt eine verknüpfungsfähige Vorgangsfactory, die automatisch alle erstellten Aufgaben zu einer Auflistung hinzufügt, die gemeinsam verknüpft werden kann.

CreateNoOpContext()

Initialisiert eine neue Instanz der Klasse, die JoinableTaskContext für die no-op von Aufrufen SwitchToMainThreadAsync(CancellationToken)konfiguriert ist.

Dispose()

Ein allgemeiner Kontext, in dem verknüpfungsfähige Aufgaben erstellt und interagiert werden können, um Deadlocks zu vermeiden.

Dispose(Boolean)

Entfernt verwaltete und nicht verwaltete Ressourcen, die von dieser Instanz gehalten werden.

GetHangReport()

Trägt Daten für einen Hang-Bericht bei.

IsMainThreadBlocked()

Ruft einen Wert ab, der angibt, ob der Hauptthread für den Abschluss des Aufrufers blockiert wird.

IsMainThreadMaybeBlocked()

Ruft einen sehr wahrscheinlichen Wert ab, ob der Hauptthread für den Abschluss des Aufrufers blockiert wird. Es ist weniger genau, wenn die Blockierungsaufgabe des UI-Threads gerade gestartet und noch nicht blockiert wurde, oder die Abhängigkeitskette wird gerade entfernt. Im Gegensatz dazu IsMainThreadBlocked()ist diese Implementierung jedoch gesperrt und in szenarien mit hohem Inhalt schneller.

OnFalseHangDetected(TimeSpan, Guid)

Wird aufgerufen, wenn ein früherer Hang-Bericht falsch alarmiert ist.

OnHangDetected(TimeSpan, Int32, Guid)

Wird aufgerufen, wenn ein Hang vermutet wird, dass er mit dem Hauptthread aufgetreten ist.

SuppressRelevance()

Verdeckt joinableTask, dem der Aufrufer zugeordnet ist, bis der zurückgegebene Wert verworfen wird.

Explizite Schnittstellenimplementierungen

Name Beschreibung
IHangReportContributor.GetHangReport()

Trägt Daten für einen Hang-Bericht bei.

Gilt für:

Threadsicherheit

Dieser Typ ist threadsicher für alle Mitglieder.