共用方式為


在受控程式碼中管理多個執行緒

如果您有 Managed VSPackage 擴充功能,其會呼叫異步方法,或在 Visual Studio UI 執行緒以外的執行緒上執行作業,則應該遵循下列指導方針。 您可以讓 UI 執行緒保持回應性,因為它不需要等待另一個執行緒上的工作完成。 您可以讓程式碼更有效率,因為您沒有佔用堆疊空間的額外執行緒,因此您可以更可靠且更容易地偵錯,因為您可以避免鎖死和沒有回應的程式碼。

一般而言,您可以從 UI 執行緒切換到不同的執行緒,反之亦然。 當方法傳回時,目前執行緒是原本呼叫執行緒的執行緒。

重要

下列指導方針會使用Microsoft.VisualStudio.Threading 命名空間中的 API,特別是 JoinableTaskFactory 類別。 此命名空間中的 API 是 Visual Studio 2013 的新功能。 您可以從 ThreadHelper 屬性ThreadHelper.JoinableTaskFactory取得 JoinableTaskFactory 的執行個體。

從 UI 執行緒切換至背景執行緒

  1. 如果您在 UI 執行緒上,而且想要在背景執行緒上執行異步工作,請使用 Task.Run()

    await Task.Run(async delegate{
        // Now you're on a separate thread.
    });
    // Now you're back on the UI thread.
    
    
  2. 如果您在 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 執行緒

  1. 如果您在背景執行緒上,而且想要在 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.
    });