gpt4 book ai didi

c# - SynchronizationContext 和 ASP.NET Web API 扩展点

转载 作者:太空狗 更新时间:2023-10-29 20:37:10 25 4
gpt4 key购买 nike

当我们在处理 ASP.NET Web API 中的一些扩展点时,我们也会处理 TAP(基于任务的编程模式)。在某些时候,我们希望使用 ContinueWith 为异步方法提供延续,我们在传递给 ContinueWith 的委托(delegate)中做了一些事情。

正如 Brad Wilson 解释的那样 here当我们提供延续时,SynchronizationContext 是至关重要的。对我来说,我唯一需要回到 ASP.NET Web API 中的 SynchronizationContext 的地方就是我需要使用 HttpContext.Current 的地方(这是我在 ASP.NET Web API 应用程序中永远不会做的事情)以及我需要为基于线程设置一些信息的地方,例如 Thread.CurrentPrincipal

所以问题是:当我们在某些扩展点(例如消息处理程序、过滤器、格式化程序等)中提供延续时,我们是否想回到 SynchronizationContext

最佳答案

答案几乎总是

这并不是说您总是要使用同步上下文,但是考虑到消息处理程序、过滤器和格式化程序的性质,您无法预测它们是否会需要使用 SynchronizationContext为了访问 HttpContextBase .

即使使用过滤器,你传递的东西可以让你访问 HttpContext(比如通过 IActionFilter implementation ),HttpContext 最终看起来当前CallContext在线程上提供来自该实例的信息。因为当前线程(运行异步时)在您启动 Task 时没有该信息,所以这些调用将失败。

也就是说,如果您需要对与请求关联的 HttpContextBase 进行一般的、不受限制的访问,那么您绝对必须传递 SynchronizationContext 以便访问它。

但是,如果可能的话,您应该从HttpContextBase 中复制您需要的详细信息,然后传递那个;如果您正在写一些非常笼统的东西,那么这是不可能的。

关于c# - SynchronizationContext 和 ASP.NET Web API 扩展点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12235273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com