方法: マネージド コードの複数のスレッドを管理する
非同期メソッドを呼び出すか、Visual Studio UI スレッド以外のスレッドで実行される操作を持つマネージド VSPackage 拡張機能がある場合、次のガイドラインに従う必要があります。 別のスレッドでの作業が完了するまで待機する必要がないため、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 スレッドにメッセージをポストします。また、スレッド フレームワークの残りの部分と通信して、正しい優先順位を設定し、デッドロックを回避します。
バックグラウンド スレッド メソッドが非同期ではなく、非同期にすることができない場合でも、次の例のように、Run を使用して作業をラップすることで、
await
構文を使用して UI スレッドに切り替えることができます。ThreadHelper.JoinableTaskFactory.Run(async delegate { // Switch to main thread await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); // Do your work on the main thread here. });