言語

JoinableTaskContext クラス

定義

デッドロックを回避するために、参加可能なタスクを作成して対話できる共通コンテキスト。

public ref class JoinableTaskContext : IDisposable, Microsoft::VisualStudio::Threading::IHangReportContributor
public class JoinableTaskContext : IDisposable, Microsoft.VisualStudio.Threading.IHangReportContributor
type JoinableTaskContext = class
    interface IHangReportContributor
    interface IDisposable
Public Class JoinableTaskContext
Implements IDisposable, IHangReportContributor
継承
JoinableTaskContext
実装

注釈

JoinableTasks を使用または操作するときに厳密に従う必要がある規則は 3 つあります。1。 メソッドに特定のスレッド アパートメント要件 (STA または MTA) がある場合は、次のいずれかを行う必要があります。a) 非同期シグネチャを持ち、最初に互換性のあるスレッドで呼び出されていない場合は、適切なスレッドに非同期的にマーシャリングします。 メイン スレッドに切り替えるには、次の方法をお勧めします。

await JoinableTaskFactory.SwitchToMainThreadAsync();

b) 同期署名があり、間違ったスレッドで呼び出されたときに例外をスローします。 特に、別のスレッドに作業を同期的にマーシャリングするメソッドは許可されていません (その作業が完了している間はブロックされます)。 一般的に同期ブロックは、可能な限り回避する必要があります。 2. 既に出荷されているパブリック API の実装で、完了のために非同期コードとブロックを呼び出す必要がある場合は、次の単純なパターンに従ってこれを行う必要があります。

JoinableTaskFactory.Run(async delegate {
    await SomeOperationAsync(...);
});
  1. 以前に開始された作業を待っている場合は、その作業を参加させる必要があります。 たとえば、1 つのサービスが、後で同期的にブロックされる可能性のある非同期作業を開始します。
JoinableTask longRunningAsyncWork = JoinableTaskFactory.RunAsync(async delegate {
    await SomeOperationAsync(...);
});

その後、非同期作業がブロックされます。

longRunningAsyncWork.Join();

または、次の場合があります。

await longRunningAsyncWork;

ただし、非同期操作を開始した直後に待機する場合は、この追加の手順は必要ありません。

コンストラクター

名前 説明
JoinableTaskContext()

現在のスレッドがメイン スレッドであると仮定して、 JoinableTaskContext クラスの新しいインスタンスを初期化し、 Current は別のスレッドからメイン スレッドに切り替える手段を提供します。

JoinableTaskContext(Thread, SynchronizationContext)

JoinableTaskContext クラスの新しいインスタンスを初期化します。

プロパティ

名前 説明
Factory

結合可能なタスク コレクションに属していない結合可能なタスクを作成するファクトリを取得します。

IsNoOpContext

このインスタンスがメイン スレッドに関連付けられていないかどうかを示す値を取得します (例: CreateNoOpContext()で作成)。

IsOnMainThread

呼び出し元がメイン スレッドで実行されているかどうかを示す値を取得します。

IsWithinJoinableTask

呼び出し元が現在、結合可能なタスクのコンテキスト内で実行されているかどうかを示す値を取得します。

MainThread

このコンテキストによって作成されたタスクで共有できるメイン スレッドを取得します。

NoMessagePumpSynchronizationContext

SynchronizationContextを取得します。これを適用すると、呼び出し元スレッドの同期ブロック中に実行される可能性のあるメッセージ ポンプが抑制されます。

メソッド

名前 説明
Capture()

呼び出し元のコンテキストをキャプチャし、後続の RunAsync(Func<Task>, String, JoinableTaskCreationOptions) 呼び出しを介してアプリケーションに適した文字列としてシリアル化します。

CreateCollection()

インフライト参加可能なタスクのコレクションを作成します。

CreateDefaultFactory()

JoinableTaskCollectionなしでファクトリを作成します。

CreateFactory(JoinableTaskCollection)

作成したすべてのタスクを、共同で結合できるコレクションに自動的に追加する、結合可能なタスク ファクトリを作成します。

CreateNoOpContext()

SwitchToMainThreadAsync(CancellationToken)の呼び出しに no-op するように構成されたJoinableTaskContext クラスの新しいインスタンスを初期化します。

Dispose()

デッドロックを回避するために、参加可能なタスクを作成して対話できる共通コンテキスト。

Dispose(Boolean)

このインスタンスによって保持されているマネージド リソースとアンマネージド リソースを破棄します。

GetHangReport()

ハング レポートのデータを提供します。

IsMainThreadBlocked()

メイン スレッドが呼び出し元の完了に対してブロックされているかどうかを示す値を取得します。

IsMainThreadMaybeBlocked()

メイン スレッドが呼び出し元の完了に対してブロックされているかどうかを示す可能性の高い値を取得します。 UI スレッドのブロック タスクが開始され、まだブロックされていない場合や、依存関係チェーンが削除された場合は、精度が低下します。 ただし、 IsMainThreadBlocked()とは異なり、この実装はロックフリーであり、高競合シナリオでは高速です。

OnFalseHangDetected(TimeSpan, Guid)

以前のハング レポートが誤アラームの場合に呼び出されます。

OnHangDetected(TimeSpan, Int32, Guid)

メイン スレッドに関連してハングが発生したと疑われるときに呼び出されます。

SuppressRelevance()

返された値が破棄されるまで、呼び出し元が関連付けられている JoinableTask を隠します。

明示的なインターフェイスの実装

名前 説明
IHangReportContributor.GetHangReport()

ハング レポートのデータを提供します。

適用対象

スレッド セーフ

この型は、すべてのメンバーに対してスレッド セーフです。