Verwalten mehrerer Threads in verwaltetem Code
Wenn Sie über eine verwaltete VSPackage-Erweiterung verfügen, die asynchrone Methoden aufruft oder Vorgänge enthält, die in anderen Threads als dem Visual Studio-UI-Thread ausgeführt werden, sollten Sie die unten angegebenen Richtlinien befolgen. Sie können den UI-Thread reaktionsfähig halten, da er nicht warten muss, bis die Arbeit an einem anderen Thread abgeschlossen ist. Sie können Ihren Code effizienter gestalten, da Sie keine zusätzlichen Threads haben, die Stapelplatz belegen, und Sie können es zuverlässiger und einfacher debuggen, da Sie Deadlocks und nicht reagierenden Code vermeiden.
Im Allgemeinen können Sie vom UI-Thread zu einem anderen Thread wechseln oder umgekehrt. Wenn die Methode zurückgegeben wird, ist der aktuelle Thread der Thread, aus dem sie ursprünglich aufgerufen wurde.
Wichtig
Die folgenden Richtlinien verwenden die APIs im Microsoft.VisualStudio.Threading Namespace, insbesondere die JoinableTaskFactory Klasse. Die APIs in diesem Namespace sind neu in Visual Studio 2013. Sie können eine Instanz einer JoinableTaskFactory aus der ThreadHelper Eigenschaft ThreadHelper.JoinableTaskFactory
abrufen.
Wechseln vom UI-Thread zu einem Hintergrundthread
Wenn Sie sich im UI-Thread befinden und asynchrone Arbeit an einem Hintergrundthread ausführen möchten, verwenden Sie
Task.Run()
Folgendes:await Task.Run(async delegate{ // Now you're on a separate thread. }); // Now you're back on the UI thread.
Wenn Sie sich im UI-Thread befinden und während der Ausführung von Arbeiten an einem Hintergrundthread synchron blockieren möchten, verwenden Sie die TaskScheduler Eigenschaft
TaskScheduler.Default
in Run:// using Microsoft.VisualStudio.Threading; ThreadHelper.JoinableTaskFactory.Run(async delegate { await TaskScheduler.Default; // You're now on a separate thread. DoSomethingSynchronous(); await OrSomethingAsynchronous(); });
Wechseln von einem Hintergrundthread zum UI-Thread
Wenn Sie sich in einem Hintergrundthread befinden und im UI-Thread etwas tun möchten, verwenden SwitchToMainThreadAsyncSie Folgendes:
// Switch to main thread await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
Sie können die SwitchToMainThreadAsync Methode verwenden, um zum UI-Thread zu wechseln. Diese Methode sendet eine Nachricht an den UI-Thread mit der Fortsetzung der aktuellen asynchronen Methode und kommuniziert auch mit dem rest des Threadingframeworks, um die richtige Priorität festzulegen und Deadlocks zu vermeiden.
Wenn Ihre Hintergrundthreadmethode nicht asynchron ist und Sie sie nicht asynchron machen können, können Sie die Syntax weiterhin verwenden
await
, um zum UI-Thread zu wechseln, indem Sie Ihre Arbeit umschließen Run, wie im folgenden Beispiel gezeigt:ThreadHelper.JoinableTaskFactory.Run(async delegate { // Switch to main thread await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); // Do your work on the main thread here. });