【问题标题】:Hook when async method is started启动异步方法时挂钩
【发布时间】:2012-10-06 04:32:45
【问题描述】:

在异步/等待机制中是否有一个集成点来挂钩并知道异步方法何时启动?

自定义 TaskScheduler 可以提供这个钩子吗?自定义 SynchronizationContext?

我希望能够跟踪某些方法调用并知道它们与哪个任务(或代码)相关联。

谢谢!

【问题讨论】:

  • 你为什么要这样做?你在说什么样的记录保存?你试过什么?
  • 方法一调用就启动。真的不清楚你的意思......
  • 我想在代码中找到一个位置,可以通知我异步方法已启动,而无需修改调用站点或被调用者。
  • TaskScheduler 可以做到这一点,主要是。我能想到 2 个问题:1) 很难将 Task 实例与 async 方法(及其延续)相匹配。 2) 任何async 方法都可以使用ConfigureAwait 跳出你的TaskScheduler。唯一可靠的解决方案是使用分析 API,这会很困难(而且您仍然必须以某种方式解决问题 (1))。

标签: c# async-await c#-5.0


【解决方案1】:

根据“任务状态”部分中的Task-based Asynchronous Pattern

从 TAP 方法返回的所有任务都必须是“热的”[...],这意味着它们所代表的异步操作已经启动,并且它们的 TaskStatus 是 Created 以外的枚举值。

这意味着您将始终在创建 Task 时立即启动它(至少如果工厂方法实现了 TAP,对于 .Net 框架提供的所有方法都是如此)。

如果您使用new Task() 创建并返回“冷”(非运行)Task,则无法确定是否调用了Task.Start() 方法。您只能定期检查TaskStatus 属性。

【讨论】:

  • 谢谢,彼得 B!这是很好的信息。这些任务都是“热的”,我不需要知道它们是否已启动(因为它们肯定已启动)但是何时启动任何其他未知的任务(检测到 of 用户代码一个初始化的库)
  • 抱歉让您误会了。正如 stephen Cleary 所提到的,您可以尝试提供一个重载 TryDequeueTaskScheduler。除了他提到的问题之外,您还应该考虑到,TAP 的基本思想是,资源管理是隐藏的。 TAP 方法甚至可能不使用任务,而是使用线程、事件或内部同步代码。 TAP 方法也可能返回 void 而不是 Task。
猜你喜欢
  • 2016-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
相关资源
最近更新 更多