在受控程式碼中管理多個執行緒
如果您有 Managed VSPackage 擴充功能,其會呼叫異步方法,或在 Visual Studio UI 執行緒以外的執行緒上執行作業,則應該遵循下列指導方針。 您可以讓 UI 執行緒保持回應性,因為它不需要等待另一個執行緒上的工作完成。 您可以讓程式碼更有效率,因為您沒有佔用堆疊空間的額外執行緒,因此您可以更可靠且更容易地偵錯,因為您可以避免鎖死和沒有回應的程式碼。
一般而言,您可以從 UI 執行緒切換到不同的執行緒,反之亦然。 當方法傳回時,目前執行緒是原本呼叫執行緒的執行緒。
重要
下列指導方針會使用Microsoft.VisualStudio.Threading 命名空間中的 API,特別是 JoinableTaskFactory 類別。 此命名空間中的 API 是 Visual Studio 2013 的新功能。 您可以從 ThreadHelper 屬性ThreadHelper.JoinableTaskFactory
取得 JoinableTaskFactory 的執行個體。
從 UI 執行緒切換至背景執行緒
如果您在 UI 執行緒上,而且想要在背景執行緒上執行異步工作,請使用
Task.Run()
:await Task.Run(async delegate{ // Now you're on a separate thread. }); // Now you're back on the UI thread.
如果您在 UI 執行緒上,而且想要在背景執行緒上執行工作時同步封鎖,請使用 Run 內的 TaskScheduler 屬性
TaskScheduler.Default
:// using Microsoft.VisualStudio.Threading; ThreadHelper.JoinableTaskFactory.Run(async delegate { await TaskScheduler.Default; // You're now on a separate thread. DoSomethingSynchronous(); await OrSomethingAsynchronous(); });
從背景執行緒切換至 UI 執行緒
如果您在背景執行緒上,而且想要在 UI 執行緒上執行工作,請使用 SwitchToMainThreadAsync:
// Switch to main thread await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
您可以使用 SwitchToMainThreadAsync 方法切換至 UI 執行緒。 這個方法會使用目前異步方法的接續,將訊息張貼至 UI 執行緒,並且也會與執行緒架構的其餘部分通訊,以設定正確的優先順序,並避免鎖死。
如果您的背景執行緒方法不是異步的,而且您無法將其設為異步,您仍然可以使用
await
語法來用 Run 包裝您的工作,以切換至 UI 執行緒,如下列範例所示:ThreadHelper.JoinableTaskFactory.Run(async delegate { // Switch to main thread await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); // Do your work on the main thread here. });