JoinableTaskContext Třída

Definice

Běžný kontext, ve kterém se můžou vytvářet spojitelné úlohy a interagovat, aby se zabránilo vzájemnému zablokování.

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
Dědičnost
JoinableTaskContext
Implementuje

Poznámky

Při používání nebo interakci s JoinableTasks byste měli striktně dodržovat tři pravidla: 1. Pokud má metoda určité požadavky na podproces (STA nebo MTA), musí mít buď: a) asynchronní podpis a asynchronně zařazovat do příslušného vlákna, pokud není původně vyvolána na kompatibilním vlákně. Doporučený způsob přepnutí na hlavní vlákno:

await JoinableTaskFactory.SwitchToMainThreadAsync();

b) Mají synchronní podpis a při zavolání v nesprávném vlákně vyvolá výjimku. Konkrétně není povolena žádná metoda synchronně zařazovat práci do jiného vlákna (blokuje, dokud je tato práce dokončena). Synchronním blokům je obecně třeba se vyhnout, kdykoli je to možné. 2. Pokud implementace už dodávaného veřejného rozhraní API musí volat asynchronní kód a blokovat pro jeho dokončení, musí to provést pomocí tohoto jednoduchého vzoru:

JoinableTaskFactory.Run(async delegate {
    await SomeOperationAsync(...);
});
  1. Pokud někdy čekáte na práci, která byla zahájena dříve, musí být tato práce připojena. Například jedna služba spustí asynchronní práci, která může později synchronně blokovat:
JoinableTask longRunningAsyncWork = JoinableTaskFactory.RunAsync(async delegate {
    await SomeOperationAsync(...);
});

Později se asynchronní práce stane blokující:

longRunningAsyncWork.Join();

nebo možná:

await longRunningAsyncWork;

Upozorňujeme však, že tento dodatečný krok není nutný, pokud se čekání provede okamžitě po spuštění asynchronní operace.

Konstruktory

JoinableTaskContext()

Inicializuje novou instanci třídy za předpokladu JoinableTaskContext , že aktuální vlákno je hlavní vlákno a Current poskytne prostředky k přepnutí na hlavní vlákno z jiného vlákna.

JoinableTaskContext(Thread, SynchronizationContext)

Inicializuje novou instanci JoinableTaskContext třídy .

Vlastnosti

Factory

Získá objekt pro vytváření, který vytváří spojitelné úlohy, které nepatří do spojitelné kolekce úloh.

IsOnMainThread

Získá hodnotu označující, zda je volající spuštěn v hlavním vlákně.

IsWithinJoinableTask

Získá hodnotu označující, zda volající je aktuálně spuštěn v kontextu spojitelné úlohy.

MainThread

Získá hlavní vlákno, které mohou být sdíleny úkoly vytvořené v tomto kontextu.

NoMessagePumpSynchronizationContext

SynchronizationContext Získá, který při použití, potlačí všechny zprávy pumpy, které mohou běžet během synchronní bloky volající vlákno.

Metody

Capture()

Zachycuje kontext volajícího a serializuje ho jako řetězec, který je vhodný pro aplikaci prostřednictvím následného volání .RunAsync(Func<Task>, String, JoinableTaskCreationOptions)

CreateCollection()

Vytvoří kolekci pro úkoly, které se dají připojit v rámci nasazení.

CreateDefaultFactory()

Vytvoří továrnu bez objektu JoinableTaskCollection.

CreateFactory(JoinableTaskCollection)

Vytvoří objekt pro vytváření spojitelných úloh, který automaticky přidá všechny vytvořené úkoly do kolekce, ke které je možné připojit společně.

Dispose()

Běžný kontext, ve kterém se můžou vytvářet spojitelné úlohy a interagovat, aby se zabránilo vzájemnému zablokování.

Dispose(Boolean)

Odstraní spravované a nespravované prostředky uchovávané touto instancí.

GetHangReport()

Přispívá daty pro sestavu zablokování.

IsMainThreadBlocked()

Získá hodnotu označující, zda hlavní vlákno je blokována pro dokončení volajícího.

IsMainThreadMaybeBlocked()

Získá velmi pravděpodobnou hodnotu, zda hlavní vlákno je blokována pro dokončení volajícího. Je méně přesné, když se úloha blokující vlákno uživatelského rozhraní právě spustí a ještě nebyla zablokovaná, nebo když je řetězec závislostí prostě odebraný. Na rozdíl od IsMainThreadBlocked()je však tato implementace bez uzamčení a ve scénářích s velkými kolizí rychlejší.

OnFalseHangDetected(TimeSpan, Guid)

Vyvoláno, když se dřívější sestava zablokuje, je falešný alarm.

OnHangDetected(TimeSpan, Int32, Guid)

Vyvoláno při podezření, že došlo k zablokování zahrnující hlavní vlákno.

SuppressRelevance()

Skryje všechny JoinableTask volající je přidružena, dokud vrácená hodnota je odstraněna.

Explicitní implementace rozhraní

IHangReportContributor.GetHangReport()

Přispívá daty pro sestavu zablokování.

Platí pro

Bezpečný přístup z více vláken

Tento typ je bezpečný pro přístup z více vláken pro všechny členy.