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 或与 JoinableTasks 交互时,应严格遵循三个规则:1。 如果方法具有某些线程单元要求 (STA 或 MTA) 则它必须:) 具有异步签名,如果最初未在兼容线程上调用,则异步封送到相应的线程。 切换到main线程的建议方法是:

await JoinableTaskFactory.SwitchToMainThreadAsync();

b) 具有同步签名,并在错误线程上调用时引发异常。 具体而言,不允许任何方法将工作同步封送到另一个线程, (阻塞,而该工作) 完成。 一般情况下,应尽可能避免同步块。 2. 当已交付的公共 API 的实现必须调用异步代码并阻止其完成时,它必须遵循以下简单模式:

JoinableTaskFactory.Run(async delegate {
    await SomeOperationAsync(...);
});
  1. 如果曾经等待过之前开始的工作,该工作必须已加入。 例如,一个服务启动一些异步工作,这些工作以后可能会成为同步阻塞:
JoinableTask longRunningAsyncWork = JoinableTaskFactory.RunAsync(async delegate {
    await SomeOperationAsync(...);
});

然后,异步工作会阻塞:

longRunningAsyncWork.Join();

或者:

await longRunningAsyncWork;

但请注意,在启动异步操作后立即完成等待时,不需要执行此额外步骤。

构造函数

JoinableTaskContext()

初始化 类的新实例JoinableTaskContext,假定当前线程是main线程,并提供Current从另一个线程切换到main线程的方法。

JoinableTaskContext(Thread, SynchronizationContext)

初始化 JoinableTaskContext 类的新实例。

属性

Factory

获取创建不属于可加入任务集合的可加入任务的工厂。

IsOnMainThread

获取一个值,该值指示调用方是否在main线程上执行。

IsWithinJoinableTask

获取一个值,该值指示调用方当前是否在可联接任务的上下文中运行。

MainThread

获取可由此上下文创建的任务共享的主线程。

NoMessagePumpSynchronizationContext

获取一个 SynchronizationContext ,应用时,它将禁止在调用线程的同步块期间可能运行的任何消息泵。

方法

Capture()

捕获调用方上下文,并通过后续调用 RunAsync(Func<Task>, String, JoinableTaskCreationOptions)将其序列化为适合应用程序的字符串。

CreateCollection()

创建飞行中可加入任务的集合。

CreateDefaultFactory()

不用 JoinableTaskCollection 来创建工厂。

CreateFactory(JoinableTaskCollection)

创建一个可加入的任务工厂,该任务工厂可自动将所有创建的任务添加到一个可共同联接的集合中。

Dispose()

可加入的任务可在其中创建且交互以避免死锁的通用上下文。

Dispose(Boolean)

释放此实例持有的托管和非托管资源。

GetHangReport()

提供挂起报告数据。

IsMainThreadBlocked()

获取一个值,该值指示调用方完成时是否阻止main线程。

IsMainThreadMaybeBlocked()

获取一个非常可能的值,该值指示调用方完成时是否阻止了main线程。 当 UI 线程阻止任务刚刚启动且尚未被阻止,或者刚删除依赖项链时,它不太准确。 但是,与 不同 IsMainThreadBlocked(),此实现是无锁的,在高争用方案中速度更快。

OnFalseHangDetected(TimeSpan, Guid)

在以前的挂起报告为误报时调用。

OnHangDetected(TimeSpan, Int32, Guid)

当怀疑发生了涉及main线程的挂起时调用。

SuppressRelevance()

隐藏与调用方有关的所有 JoinableTask,直到释放返回值。

显式接口实现

IHangReportContributor.GetHangReport()

提供挂起报告数据。

适用于

线程安全性

此类型对所有成员都是线程安全的。