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
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.
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
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. });