Język

JoinableTaskContext Klasa

Definicja

Typowy kontekst, w którym można tworzyć zadania umożliwiające sprzężenie i wchodzić w interakcje, aby uniknąć zakleszczenia.

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 powinny być ściśle przestrzegane 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: a) Mieć sygnaturę asynchroniczną i asynchronicznie marshaling do odpowiedniego wątku, jeśli nie jest on pierwotnie wywoływany w zgodnym wątku. Zalecanym sposobem przełączenia się na główny wątek 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). Bloki synchroniczne należy unikać zawsze, gdy 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 czekasz na pracę, która została uruchomiona wcześniej, należy dołączyć do tej pracy. Na przykład jedna usługa rozpoczyna asynchroniczną pracę, która może później stać się synchronicznie blokująca:
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 na wykonanie natychmiast po rozpoczęciu operacji asynchronicznej.

Konstruktory

Nazwa Opis
JoinableTaskContext()

Inicjuje nowe wystąpienie JoinableTaskContext klasy przy założeniu, że bieżący wątek jest głównym wątkiem i Current zapewni środki przełączenia się do głównego wątku z innego wątku.

JoinableTaskContext(Thread, SynchronizationContext)

Inicjuje nowe wystąpienie klasy JoinableTaskContext.

Właściwości

Nazwa Opis
Factory

Pobiera fabrykę, która tworzy sprzężone zadania, które nie należą do kolekcji zadań możliwych do sprzężenia.

IsNoOpContext

Pobiera wartość wskazującą, czy to wystąpienie nie jest skojarzone z żadnym wątkiem głównym (np. utworzonym za pomocą polecenia CreateNoOpContext()).

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

Nazwa Opis
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órą można połączyć wspólnie.

CreateNoOpContext()

Inicjuje JoinableTaskContext nowe wystąpienie klasy skonfigurowanej do no-op wywołań do klasy SwitchToMainThreadAsync(CancellationToken).

Dispose()

Typowy kontekst, w którym można tworzyć zadania umożliwiające sprzężenie i wchodzić w interakcje, aby uniknąć zakleszczenia.

Dispose(Boolean)

Usuwa zarządzane i niezarządzane zasoby przechowywane przez to wystąpienie.

GetHangReport()

Współtworzy dane dla raportu zawieszenia.

IsMainThreadBlocked()

Pobiera wartość wskazującą, czy główny wątek jest zablokowany na potrzeby ukończenia elementu wywołującego.

IsMainThreadMaybeBlocked()

Pobiera bardzo prawdopodobną wartość, czy główny wątek jest blokowany dla ukończenia elementu wywołującego. Jest mniej dokładne, gdy zadanie blokujące wątki interfejsu użytkownika jest uruchamiane i nie zostało jeszcze zablokowane lub łańcuch zależności został właśnie usunięty. Jednak w przeciwieństwie do IsMainThreadBlocked()programu ta implementacja jest bezpłatna i szybsza w scenariuszach o wysoką rywalizację.

OnFalseHangDetected(TimeSpan, Guid)

Wywoływane, gdy wcześniejszy raport zawieszenia jest fałszywym alarmem.

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, dopóki zwrócona wartość nie zostanie usunięta.

Jawne implementacje interfejsu

Nazwa Opis
IHangReportContributor.GetHangReport()

Współtworzy dane dla raportu zawieszenia.

Dotyczy

Bezpieczeństwo wątkowe

Ten typ jest bezpieczny wątkowo dla wszystkich elementów członkowskich.