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

Pokud máte spravované rozšíření VSPackage, které volá asynchronní metody nebo má operace spouštěné na podprocesech jiné než vlákno uživatelského rozhraní sady Visual Studio, měli byste postupovat podle pokynů uvedených níže. Vlákno uživatelského rozhraní můžete zachovat responzivní, protože nemusí čekat na dokončení práce na jiném vlákně. Kód můžete zefektivnit, protože nemáte další vlákna, která zabírají místo na zásobníku, a můžete ho lépe ladit, protože se vyhnete zablokování a nereagujete na kód.

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

Důležité

Následující pokyny používají rozhraní API v Microsoft.VisualStudio.Threading oboru názvů, zejména JoinableTaskFactory třídu. Rozhraní API v tomto oboru názvů jsou v sadě Visual Studio 2013 nová. Z vlastnosti můžete získat instanci objektu JoinableTaskFactoryThreadHelper .ThreadHelper.JoinableTaskFactory

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

  1. Pokud používáte vlákno uživatelského rozhraní a chcete provádět asynchronní práci na 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 používáte vlákno uživatelského rozhraní a chcete synchronně blokovat 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í na vlákno uživatelského rozhraní

  1. Pokud používáte vlákno 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();
    

    Metodu SwitchToMainThreadAsync můžete použít k přepnutí do vlákna uživatelského rozhraní. Tato metoda publikuje zprávu do vlákna uživatelského rozhraní s pokračováním aktuální asynchronní metody a také komunikuje se zbytkem architektury threading, aby se nastavil správná priorita a zabránil zablokování.

    Pokud vaše metoda vlákna na pozadí není asynchronní a nemůžete ji nastavit jako asynchronní, můžete stále pomocí await syntaxe přepnout na vlákno uživatelského rozhraní tak, že zabalíte svou práci s Run, jak je znázorněno 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.
    });