JoinableTaskContext Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
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(...);
});
- 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.