Udostępnij za pośrednictwem


Zarządzanie wieloma wątkami w kodzie zarządzanym

Jeśli masz zarządzane rozszerzenie VSPackage, które wywołuje metody asynchroniczne lub ma operacje wykonywane w wątkach innych niż wątek interfejsu użytkownika programu Visual Studio, należy postępować zgodnie z poniższymi wytycznymi. Możesz zachować czas odpowiedzi wątku interfejsu użytkownika, ponieważ nie musi czekać na pracę w innym wątku, aby ukończyć. Możesz zwiększyć wydajność kodu, ponieważ nie masz dodatkowych wątków, które zajmują miejsce na stosie, i możesz uczynić go bardziej niezawodnym i łatwiejszym do debugowania, ponieważ unikasz zakleszczeń i nie odpowiadasz.

Ogólnie rzecz biorąc, można przełączyć się z wątku interfejsu użytkownika na inny wątek lub na odwrót. Gdy metoda zwraca, bieżący wątek jest wątkiem, z którego został pierwotnie wywołany.

Ważne

Poniższe wskazówki używają interfejsów API w Microsoft.VisualStudio.Threading przestrzeni nazw, w szczególności JoinableTaskFactory klasy. Interfejsy API w tej przestrzeni nazw są nowe w programie Visual Studio 2013. Wystąpienie obiektu JoinableTaskFactory można pobrać z ThreadHelper właściwości ThreadHelper.JoinableTaskFactory.

Przełączanie z wątku interfejsu użytkownika na wątek w tle

  1. Jeśli jesteś w wątku interfejsu użytkownika i chcesz wykonać asynchroniczną pracę w wątku w tle, użyj polecenia Task.Run():

    await Task.Run(async delegate{
        // Now you're on a separate thread.
    });
    // Now you're back on the UI thread.
    
    
  2. Jeśli jesteś w wątku interfejsu użytkownika i chcesz synchronicznie zablokować podczas wykonywania pracy w wątku w tle, użyj TaskScheduler właściwości TaskScheduler.Default wewnątrz Run:

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

Przełączanie z wątku w tle do wątku interfejsu użytkownika

  1. Jeśli jesteś w wątku w tle i chcesz zrobić coś w wątku interfejsu użytkownika, użyj polecenia SwitchToMainThreadAsync:

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

    Możesz użyć SwitchToMainThreadAsync metody , aby przełączyć się do wątku interfejsu użytkownika. Ta metoda publikuje komunikat do wątku interfejsu użytkownika z kontynuacją bieżącej metody asynchronicznej, a także komunikuje się z resztą struktury wątków w celu ustawienia prawidłowego priorytetu i uniknięcia zakleszczenia.

    Jeśli metoda wątku w tle nie jest asynchroniczna i nie możesz jej asynchronizować, nadal możesz użyć await składni, aby przełączyć się do wątku interfejsu użytkownika, opakowując pracę z elementem Run, jak w tym przykładzie:

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