我们有一个遗留的VB6应用程序,它不时启动并挂起。我们认为这可能与向Citrix的转变有关,但现在可以在Win10上的厚客户端上复制这种行为。我们认为我们以前在早期的Windows版本上没有看到过这种情况,但仍在检查日志以确认这一点。
我们会体验到在文本框中切换,然后再切换的行为。当我们通过它时,我们正在进行一个简单的ado调用,以查找/验证文本框中的一些数据。作为正确程序运行的一部分,我们正在记录
“Opening Dataset: SELECT ... FROM ... ”
“Opened Dataset”
在这两个日志语句之间是一个简单的ado数据检索代码,我们以前使用它没有遇到任何问题。它位于ActiveX dll中,并且正在同步运行。最重要的是,在这两个日志语句之间,没有DoEvents
或api调用可以产生控制。据我们所见,它应该是一个纯粹的同步操作。
当系统崩溃(偶尔发生(时,我们可以看到这两个日志记录语句之间出现其他日志记录语句,它们可以是资源状态(例如内存量、gdi/用户对象——通常是因为计时器在主窗体中触发了(,也可以是焦点类型事件——它们不是计时器驱动的——至少在我们的代码库中是这样。
“Opening Dataset: SELECT ... FROM ... ”
“Resource Status: ...”
“Opened Dataset”```
或
“Opening Dataset: SELECT ... FROM ... ”
“TextItem.OnLostFocus Item1 ...”
“TextItem.Validate ...”
“TextItem.OnGotFocus Item2 ...
“Opened Dataset”
因此,我最初的问题是,在什么情况下,本应是同步操作的操作会被中断,并表现为异步操作。
例如,如果我们没有这样做,我可以想象写一些不安全的代码,通过使用多媒体定时器(在另一个线程上(并向我们的一个模块上的函数的地址提供AddressOf参数,该定时器启动我们代码的执行,与正确的控制流分开。除此之外,我看不出同步vb6代码是如何以这种方式中断的。
如果有任何想法、建议或建议,我将不胜感激。如果这太含糊了,我真的很抱歉。这也许反映了我是如何努力解决这个问题的。
只是说,我们将其追溯到Windows 10以及我们正在使用的一个旧的(不支持的(套接字组件。它看起来像是在泵送消息队列";在错误的时间";因此我们看到UI事件出现在同步进程的中间。我们在早期的Windows版本上看不到这种行为。
我不知道Win10会发生什么变化,但我们显然需要升级。
在我们的案例中,我们有几个长时间运行的计时器来从数据库中提取状态/更改,这导致了这种情况。我们将ADO与SQL Native Client和MARS结合使用,在Windows 10出现间歇性锁定之前,它们一直运行良好。日志记录和Windbg证实,当两个请求同时命中ADO连接时,就会发生这种情况。来自ADO的错误是";无法打开逻辑会话";错误号-2147467259,实际导致SQL Server 2014(在另一台计算机上运行(阻止来自多个不同应用程序和计算机的所有其他客户端查询,直到锁定的应用程序被终止。我无法在IDE中复制这一点,因为这显然会迫使计时器以他们一贯的方式工作。修复方法是异步我们的ADO实现,并在SQL连接上放置一个连接管理器,以迫使请求者等待轮到他们(基本上取消了Win10异步定时器功能(。我唯一的性能影响是,当计时器触发的SQL查询与另一个查询发生冲突时,会额外延迟几毫秒。