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