JoinableTaskContext Klasa
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Wspólny kontekst, w którym można tworzyć zadania dołączane i wchodzić w interakcje, aby uniknąć zakleszczeń.
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
- Dziedziczenie
-
JoinableTaskContext
- Implementuje
Uwagi
Istnieją trzy reguły, które należy ściśle przestrzegać podczas korzystania z funkcji JoinableTasks lub interakcji z nimi: 1. Jeśli metoda ma pewne wymagania dotyczące mieszkania wątku (STA lub MTA), musi albo: a) Mieć asynchroniczny podpis i asynchronicznie marshaling do odpowiedniego wątku, jeśli nie jest pierwotnie wywoływany w zgodnym wątku. Zalecanym sposobem przełączenia do głównego wątku jest:
await JoinableTaskFactory.SwitchToMainThreadAsync();
b) Mieć podpis synchroniczny i zgłosić wyjątek po wywołaniu nieprawidłowego wątku. W szczególności żadna metoda nie może synchronicznie marshalować pracy do innego wątku (blokowanie podczas wykonywania tej pracy). W ogóle należy unikać bloków synchronicznych, jeśli jest to możliwe. 2. Jeśli implementacja już dostarczonego publicznego interfejsu API musi wywołać kod asynchroniczny i zablokować jego ukończenie, musi to zrobić, postępując zgodnie z tym prostym wzorcem:
JoinableTaskFactory.Run(async delegate {
await SomeOperationAsync(...);
});
- Jeśli kiedykolwiek oczekiwano pracy, która została uruchomiona wcześniej, należy dołączyć do tej pracy. Na przykład jedna usługa rozpoczyna niektóre prace asynchroniczne, które mogą później stać się synchronicznie blokujące:
JoinableTask longRunningAsyncWork = JoinableTaskFactory.RunAsync(async delegate {
await SomeOperationAsync(...);
});
Następnie działanie asynchroniczne staje się blokowane:
longRunningAsyncWork.Join();
lub być może:
await longRunningAsyncWork;
Należy jednak pamiętać, że ten dodatkowy krok nie jest konieczny podczas oczekiwania jest wykonywany natychmiast po rozpoczęciu operacji asynchronicznej.
Konstruktory
JoinableTaskContext() |
Inicjuje nowe wystąpienie klasy przy założeniu JoinableTaskContext , że bieżący wątek jest głównym wątkiem i Current zapewni środki przełączenia do głównego wątku z innego wątku. |
JoinableTaskContext(Thread, SynchronizationContext) |
Inicjuje nowe wystąpienie klasy JoinableTaskContext. |
Właściwości
Factory |
Pobiera fabrykę, która tworzy sprzężone zadania, które nie należą do kolekcji zadań z możliwością sprzężenia. |
IsOnMainThread |
Pobiera wartość wskazującą, czy obiekt wywołujący wykonuje w wątku głównym. |
IsWithinJoinableTask |
Pobiera wartość wskazującą, czy obiekt wywołujący jest aktualnie uruchomiony w kontekście zadania możliwego do sprzężenia. |
MainThread |
Pobiera główny wątek, który może być współużytkowany przez zadania utworzone przez ten kontekst. |
NoMessagePumpSynchronizationContext |
Pobiera element SynchronizationContext , który po zastosowaniu pomija wszystkie pompy komunikatów, które mogą być uruchamiane podczas synchronicznych bloków wątku wywołującego. |
Metody
Capture() |
Przechwytuje kontekst obiektu wywołującego i serializuje go jako ciąg odpowiedni dla aplikacji za pośrednictwem kolejnego wywołania metody RunAsync(Func<Task>, String, JoinableTaskCreationOptions). |
CreateCollection() |
Tworzy kolekcję dla zadań przyłączonych do lotu. |
CreateDefaultFactory() |
Tworzy fabrykę bez elementu JoinableTaskCollection. |
CreateFactory(JoinableTaskCollection) |
Tworzy fabrykę zadań sprzężonych, która automatycznie dodaje wszystkie utworzone zadania do kolekcji, która może zostać połączona. |
Dispose() |
Wspólny kontekst, w którym można tworzyć zadania dołączane i wchodzić w interakcje, aby uniknąć zakleszczeń. |
Dispose(Boolean) |
Usuwa zarządzane i niezarządzane zasoby przechowywane przez to wystąpienie. |
GetHangReport() |
Współtworzy dane raportu zawieszenia. |
IsMainThreadBlocked() |
Pobiera wartość wskazującą, czy główny wątek jest zablokowany dla ukończenia elementu wywołującego. |
IsMainThreadMaybeBlocked() |
Pobiera bardzo prawdopodobną wartość, czy główny wątek jest zablokowany dla ukończenia elementu wywołującego. Jest to mniej dokładne, gdy wątek interfejsu użytkownika blokujący zadanie jest uruchamiane i nie został jeszcze zablokowany lub łańcuch zależności został właśnie usunięty. Jednak w przeciwieństwie do IsMainThreadBlocked()programu ta implementacja jest wolna od blokady i szybsza w scenariuszach o wysoką rywalizację. |
OnFalseHangDetected(TimeSpan, Guid) |
Wywoływane, gdy wcześniej zawiesza się raport jest fałszywy alarm. |
OnHangDetected(TimeSpan, Int32, Guid) |
Wywoływane, gdy podejrzewa się, że doszło do zawieszenia z udziałem głównego wątku. |
SuppressRelevance() |
Ukrywa wszelkie sprzężoneTask obiekt wywołujący jest skojarzony z elementem wywołującym do momentu usunięcia zwróconej wartości. |
Jawne implementacje interfejsu
IHangReportContributor.GetHangReport() |
Współtworzy dane raportu zawieszenia. |
Dotyczy
Bezpieczeństwo wątkowe
Ten typ jest bezpieczny wątkowo dla wszystkich elementów członkowskich.