方法: マネージド コードの複数のスレッドを管理する

非同期メソッドを呼び出すか、Visual Studio UI スレッド以外のスレッドで実行される操作を持つマネージド VSPackage 拡張機能がある場合、次のガイドラインに従う必要があります。 別のスレッドでの作業が完了するまで待機する必要がないため、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 スレッドにメッセージをポストします。また、スレッド フレームワークの残りの部分と通信して、正しい優先順位を設定し、デッドロックを回避します。

    バックグラウンド スレッド メソッドが非同期ではなく、非同期にすることができない場合でも、次の例のように、Run を使用して作業をラップすることで、await 構文を使用して UI スレッドに切り替えることができます。

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