我在 Windows 服务中有一个运行时间相当长的进程,它会定期抛出“ContextSwitchDeadlock”异常:
我还操纵我的服务向自己发送电子邮件,其中包含有关遇到的异常的详细信息。我得到:
Date: 05/25/2016 09:16:32:
Exception message: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
Exception Source: .Net SqlClient Data Provider
...然后三秒钟后:
Date: 05/25/2016 09:16:35:
Exception message: Cannot find table 0.
Exception Source: System.Data
顺便说一句:至少它是一致的:我有三对这样的异常,每次第二个的日期时间都在第一个之后的三秒。
我以前有过以这种或那种方式调整 SQLCommand 的 CommandTimeout 值(当前设置为 360)的经验,这似乎有点像蒙着眼睛扔飞镖,甚至是黑魔法。有没有更好的方法来防止这种死锁?
我有其他非常相似的方法不会导致这个问题;那些需要更少的时间。方法的持续时间(特别是查询运行所需的时间长度)似乎是“问题”。我无法改变这一点——“它就是这样”——那我还能做什么?
更新
自然地,在发布上述内容之后,顽固的过程“让我成为骗子”,因为我又得到了两对异常,这次是第二对错误消息发生在第一个而不是三个之后一秒。如果我等待的时间足够长,也许第二个异常会在第一个异常之前发生。