スレッド プールを使うためのベスト プラクティス

このトピックでは、スレッド プールを使った操作のベスト プラクティスについて説明します。

推奨

  • スレッド プールを使って、アプリの並列処理を実行します。

  • 作業項目を使って、UI スレッドをブロックせずに広範なタスクを実行します。

  • 有効期間が短く独立した作業項目を作成します。 作業項目は非同期に実行され、キューから任意の順番でプールに送ることができます。

  • Windows.UI.Core.CoreDispatcher を使って更新を UI スレッドにディスパッチします。

  • Sleep 関数ではなく ThreadPoolTimer.CreateTimer 関数を使います。

  • 独自のスレッド管理システムを作成するのではなく、スレッド プールを使います。 スレッド プールは、OS レベルで高度な機能を使って実行され、プロセス内およびシステム全体のデバイス リソースとアクティビティに従って動的にスケーリングされるように最適化されています。

  • C++ の場合、作業項目委任でアジャイル スレッド モデルを使うようにします (C++ 委任は既定でアジャイルです)。

  • 使用の時点でリソース割り当ての失敗を許容できない場合は、あらかじめ割り当てられた作業項目を使用します。

非推奨

  • period の値が <1 ミリ秒 (0 秒を含む) の定期タイマーを作成しないでください。 この場合、作業項目は 1 回限りのタイマーとして動作します。

  • period パラメーターで指定した時間よりも完了までに時間がかかる定期的な作業項目を送信しないでください。

  • バックグラウンド タスクからディスパッチされている作業項目から、UI 更新 (トーストと通知を除く) を送信しないでください。 代わりに、バックグラウンド タスクの進行ハンドラーと完了ハンドラー (IBackgroundTaskInstance.Progress など) を使います。

  • async キーワードを使用する作業項目ハンドラーを使用する場合は、ハンドラーのすべてのコードの実行が完了する前にスレッド プール作業項目が完了状態に設定される可能性があることに注意してください。 ハンドラー内の await キーワードに続くコードは、作業項目が完了状態に設定された後で実行される可能性があります。

  • あらかじめ割り当てられた作業項目を複数回実行する場合は、1 回実行するたびに再初期化してください。 定期的な作業項目の作成