Freigeben über


JoinableTaskContext Klasse

Definition

Ein allgemeiner Kontext, in dem Aufgaben, denen beigetreten werde kann, möglicherweise erstellt werden und mit denen interagiert werden kann, 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 bei der Verwendung oder Interaktion mit JoinableTasks streng befolgt werden sollten: 1. Wenn eine Methode bestimmte Thread-Apartmentanforderungen (STA oder MTA) aufweist, muss sie entweder über eine asynchrone Signatur verfügen und asynchron an den entsprechenden Thread marshallen, wenn sie ursprünglich nicht in einem kompatiblen Thread aufgerufen wird. Die empfohlene Möglichkeit, zum Standard Thread zu wechseln, ist:

await JoinableTaskFactory.SwitchToMainThreadAsync();

b) Sie verfügen über eine synchrone Signatur und lösen eine Ausnahme aus, wenn sie für den falschen Thread aufgerufen wird. Insbesondere ist keine Methode berechtigt, Arbeit synchron in einen anderen Thread zu marshallen (blockiert, während diese Arbeit abgeschlossen ist). Synchrone Blöcke sind generell möglichst zu vermeiden. 2. Wenn eine Implementierung einer bereits ausgelieferten öffentlichen API asynchronen Code aufrufen und für deren Abschluss blockieren muss, muss sie dies mithilfe dieses einfachen Musters tun:

JoinableTaskFactory.Run(async delegate {
    await SomeOperationAsync(...);
});
  1. Wenn sie jemals auf arbeit warten, die zuvor gestartet wurde, muss diese Arbeit verknüpft sein. Ein Dienst startet beispielsweise asynchrone Arbeit, die später synchron blockiert wird:
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 nicht erforderlich ist, wenn das Warten unmittelbar nach dem Starten eines asynchronen Vorgangs erfolgt.

Konstruktoren

JoinableTaskContext()

Initialisiert eine neue instance der JoinableTaskContext -Klasse unter der Annahme, dass der aktuelle Thread der Standard Thread ist, und Current bietet die Möglichkeit, von einem anderen Thread zum Standard Thread zu wechseln.

JoinableTaskContext(Thread, SynchronizationContext)

Initialisiert eine neue Instanz der JoinableTaskContext-Klasse.

Eigenschaften

Factory

Ruft die Factory ab, die Aufgaben erstellt, denen beigetreten werden kann, die keiner Aufgabenauflistung, denen beigetreten werden können, angehören.

IsOnMainThread

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

IsWithinJoinableTask

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

MainThread

Ruft den Hauptthread ab, der von den Aufgaben, die von diesen Kontext erstellt werden, gemeinsam genutzt werden kann.

NoMessagePumpSynchronizationContext

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

Methoden

Capture()

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

CreateCollection()

Erstellt eine Auflistung für Aufgaben, der während der Ausführung beigetreten werden können.

CreateDefaultFactory()

Erstellt eine Factory ohne JoinableTaskCollection.

CreateFactory(JoinableTaskCollection)

Erstellt eine Aufgabenfactory, der beigetreten werden kann, die automatisch alle erstellten Aufgabe einer Auflistung hinzufügt, die zusammen verknüpft werden kann.

Dispose()

Ein allgemeiner Kontext, in dem Aufgaben, denen beigetreten werde kann, möglicherweise erstellt werden und mit denen interagiert werden kann, um Deadlocks zu vermeiden.

Dispose(Boolean)

Löscht verwaltete und nicht verwaltete Ressourcen, die von diesem instance.

GetHangReport()

Trägt Daten für einen Absturzbericht bei.

IsMainThreadBlocked()

Ruft einen Wert ab, der angibt, ob der Standard Thread für den Abschluss des Aufrufers blockiert ist.

IsMainThreadMaybeBlocked()

Ruft einen sehr wahrscheinlichen Wert ab, ob der Standard Thread für den Abschluss des Aufrufers blockiert ist. Es ist weniger genau, wenn die Blockierungsaufgabe des UI-Threads gerade gestartet und noch nicht blockiert wurde oder die Abhängigkeitskette gerade entfernt wird. Im Gegensatz zu IsMainThreadBlocked()ist diese Implementierung jedoch sperrfrei und in Szenarien mit hohen Konflikten schneller.

OnFalseHangDetected(TimeSpan, Guid)

Wird aufgerufen, wenn ein früherer Hangbericht falscher Alarm ist.

OnHangDetected(TimeSpan, Int32, Guid)

Wird aufgerufen, wenn vermutet wird, dass ein Hängenbleiben mit dem Standard Thread aufgetreten ist.

SuppressRelevance()

Verbirgt jeden JoinableTask, dem der Aufrufer zugeordnet wird, bis der zurückgegebene Wert freigegeben ist.

Explizite Schnittstellenimplementierungen

IHangReportContributor.GetHangReport()

Trägt Daten für einen Absturzbericht bei.

Gilt für:

Threadsicherheit

Dieser Typ ist threadsicher für alle Member.