找出哪个 EF 操作正在阻塞

Posted

技术标签:

【中文标题】找出哪个 EF 操作正在阻塞【英文标题】:Finding out which EF operation is blocking 【发布时间】:2015-10-14 23:48:39 【问题描述】:

我来了

System.NotSupportedException:第二个操作开始于此 前一个异步操作完成之前的上下文。采用 'await' 以确保所有异步操作都已完成 在此上下文中调用另一个方法之前。任何实例成员 不保证是线程安全的。

完全明白,理论上我知道如何解决,这不是问题。但是对于我的生活,我找不到导致阻塞的实际操作。

这是在生产中,在中等负载下。我在调试时无法重现它。所以我需要一些方法来抛出有关未完成的 EF 请求的信息。

谢谢!

【问题讨论】:

我不确定您是否完全清楚,但“导致阻塞的实际事务”不是“未完成的 EF 请求”。导致块的“事务”(更准确地说:正在执行的上下文方法)是将完成的操作。当您收到异常时,无法找出这是哪个操作。您当然可以在堆栈跟踪中找到中断的操作(导致异常)。尽管如此,我希望我是错的,但这个例外似乎说明了一个设计缺陷:上下文生命周期长。 是的,你是对的,我的措辞很粗心。你也是正确的,问题的根源是设计缺陷,由在AuthorizationFilterAttribute 中使用相同的上下文引起的,我不知道它的寿命相当长。我只有在创建上下文并记录其使用时分配了一个 guid 后才发现这一点。 有没有办法解决寿命问题?我认为您应该在每次 OnAuthorization(Async) 方法运行时创建一个新上下文。 是的,这也是我的解决方案。目前,我在创建时在过滤器上设置了一个 Unity 容器 - 用于设置存储库 - 但为了遵循模式,我将使用委托替换它。 你为什么不发布你的AuthorizationFilterAttribute的代码? 【参考方案1】:

我不确定,但也许 DNT Profiler 可以帮助您监视和分析 EF 操作。

【讨论】:

以上是关于找出哪个 EF 操作正在阻塞的主要内容,如果未能解决你的问题,请参考以下文章

哪些阻塞操作会导致 STA 线程泵送 COM 消息?

在java多线程程序中,怎样实时找出处于等待(阻塞)状态线程、进程的个数。

EF学习笔记:更新关联数据

根据表值找出哪个模式

同步和异步

MySQL如何查看元数据锁阻塞在哪个语句上