Postupy: Správa více vláken ve spravovaném kódu

máte-li spravované rozšíření VSPackage, které volá asynchronní metody nebo obsahuje operace spouštěné na vláknech jiných než Visual Studio vláknu uživatelského rozhraní, měli byste postupovat podle pokynů uvedených níže. Vlákno uživatelského rozhraní lze nechat reagovat, protože nemusí čekat na dokončení práce na jiném vlákně. Svůj kód můžete zefektivnit, protože nemáte další vlákna, která zabírají místo v zásobníku, a můžete ho spolehlivější a jednodušší ladit, protože se vyhnete zablokování a nereagující se na kód.

Obecně můžete přepnout z vlákna uživatelského rozhraní do jiného vlákna nebo naopak. Když se metoda vrátí, aktuální vlákno je vlákno, ze kterého bylo původně voláno.

Důležité

Následující pokyny používají rozhraní API v Microsoft.VisualStudio.Threading oboru názvů, zejména JoinableTaskFactory třídy. Rozhraní API v tomto oboru názvů jsou v nástroji novinkou Visual Studio 2013 . Můžete získat instanci JoinableTaskFactory z ThreadHelper vlastnosti ThreadHelper.JoinableTaskFactory .

Přepnutí z vlákna uživatelského rozhraní do vlákna na pozadí

  1. Pokud jste ve vlákně uživatelského rozhraní a chcete provést asynchronní práci ve vlákně na pozadí, použijte Task.Run() :

    await Task.Run(async delegate{
        // Now you're on a separate thread.
    });
    // Now you're back on the UI thread.
    
    
  2. Pokud jste ve vlákně uživatelského rozhraní a chcete synchronně blokovat při práci na vlákně na pozadí, použijte TaskScheduler vlastnost TaskScheduler.Default uvnitř Run :

    // using Microsoft.VisualStudio.Threading;
    ThreadHelper.JoinableTaskFactory.Run(async delegate {
        await TaskScheduler.Default;
        // You're now on a separate thread.
        DoSomethingSynchronous();
        await OrSomethingAsynchronous();
    });
    

Přepnutí z vlákna na pozadí do vlákna uživatelského rozhraní

  1. Pokud se nacházíte ve vlákně na pozadí a chcete něco udělat ve vlákně uživatelského rozhraní, použijte SwitchToMainThreadAsync :

    // Switch to main thread
    await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
    

    Můžete použít SwitchToMainThreadAsync metodu pro přepnutí do vlákna uživatelského rozhraní. Tato metoda odesílá zprávu do vlákna uživatelského rozhraní s pokračováním aktuální asynchronní metody a také komunikuje se zbytkem rozhraní pro dělení na vlákna, aby nastavila správnou prioritu a zabránila zablokování.

    Pokud vaše metoda vlákna na pozadí není asynchronní a nemůžete ji učinit asynchronní, můžete i nadále použít await syntaxi pro přepnutí do vlákna uživatelského rozhraní, a to tak, že zabalíte svou práci s Run , jako v tomto příkladu:

    ThreadHelper.JoinableTaskFactory.Run(async delegate {
        // Switch to main thread
        await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
        // Do your work on the main thread here.
    });