Udostępnij za pośrednictwem


JoinableTaskContext Klasa

Definicja

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