次の方法で共有


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

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

IsOnMainThread

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

IsWithinJoinableTask

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

MainThread

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

NoMessagePumpSynchronizationContext

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

メソッド

Capture()

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

CreateCollection()

実行中の結合可能タスクに対応するコレクションを作成します。

CreateDefaultFactory()

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

CreateFactory(JoinableTaskCollection)

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

Dispose()

結合可能なタスクを作成し、デッドロックを回避するためにやり取りすることができる共通のコンテキスト。

Dispose(Boolean)

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

GetHangReport()

ハング レポートに関するデータを投稿します。

IsMainThreadBlocked()

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

IsMainThreadMaybeBlocked()

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

OnFalseHangDetected(TimeSpan, Guid)

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

OnHangDetected(TimeSpan, Int32, Guid)

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

SuppressRelevance()

戻り値が破棄されるまで、呼び出し元が関連付けられているすべての JoinableTask を非表示にします。

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

IHangReportContributor.GetHangReport()

ハング レポートに関するデータを投稿します。

適用対象

スレッド セーフ

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