【问题标题】:Reproduce MSACCESS.EXE process still running after application exit重现应用程序退出后仍在运行的 MSACCESS.EXE 进程
【发布时间】:2014-02-10 21:25:07
【问题描述】:

Access 有时会无法完全退出并导致 MSACCESS.EXE 进程在没有可见用户界面的情况下运行(该应用程序不再显示在任务管理器的“应用程序”选项卡中)。

重现此错误所需的最少代码是多少?


更新:我发布了一个可靠地重现问题的答案。我会对可能会重现该问题的其他场景非常感兴趣。 我将投票支持任何成功重现该问题的未来答案。我想让这个问题成为导致问题的经过验证的场景的存储库,以便将来遇到此问题的人有更好的解释然后是“关闭所有打开的对象等”的通常含糊的建议。

【问题讨论】:

  • 你为什么要这么做?
  • 几个原因。 1)我正在研究一种在程序启动时自动处理这些孤立访问进程的方法,我希望能够测试我的方法。 2) 这将帮助我识别我自己的代码中导致此类错误的问题。通常修复错误最困难的部分是能够可靠地重现它。这里就是这种情况。
  • 我在使用共享文件夹托管数据库时遇到此问题。
  • @Hiten004:你能详细说明一下吗?
  • @HansUp:我终于找到了一个帖子,其中包含可靠地重现问题的代码。这也不是我所期待的。似乎关闭所有打开的记录集的传统建议实际上在某些情况下会导致问题。

标签: ms-access vba


【解决方案1】:

我已经到处搜索了这种现象的可重复示例,最后偶然发现了来自澳大利亚布里斯班的 Chris 发布的这个答案:Something a little more subtle...我在这里重新发布他的答案,稍作修改:


创建一个新表单并添加一个名为cmdShutdown 的命令按钮,代码如下:

Dim PersistentRS As DAO.Recordset

Private Sub Form_Open(Cancel As Integer)
    Set PersistentRS = CurrentDb.OpenRecordset("SELECT * FROM msysobjects")
End Sub

Private Sub cmdShutdown_Click()
    Application.Quit            ' < This is the culprit.
End Sub

Private Sub Form_Close()
    On Error GoTo ErrorHandler
ExitProcedure:
    PersistentRS.Close    ' < This is all it requires.
    Exit Sub
ErrorHandler:
    Resume ExitProcedure
End Sub

这个问题与 PersistentRecordset 保持打开状态无关,恰恰相反。 事实上,垃圾收集器已经完成了它的工作并且已经关闭了 PersistentRecordset。

Application.Quit 在调用 Form_Close 事件之前调用了垃圾收集器。

任何 Application.Quit 命令都会调用垃圾收集器,无论该命令是否在另一个 Form 上。

一旦 Application.Quit 命令调用了垃圾收集器,所有变量都已被重置。 Application.Quit 命令然后启动关闭序列。 如果任何表单打开,则尝试将其关闭。 如果 Form 有 Form_Close 或 Form_Unload 事件,这些事件将触发。 当被 Application.Quit 命令调用时,这些事件正在使用已关闭的 PersistentRecordset 运行。

因此,如果您要查找尚未关闭的记录集,请节省一些时间。查找尝试关闭它们的记录集并删除该尝试。 我们为垃圾收集器支付了很多钱,所以我们应该使用它;有用。 尝试自己进行垃圾收集可能会导致失败。

但任何此类循环错误,而不仅仅是记录集错误,都会导致 Access 太忙而无法关闭。

克里斯。


我确认这重现了在 Windows 7 64 位中运行的 Access 2002 中的错误。

【讨论】:

  • 谢谢,迈克。我使用 Access 2007 得到了相同的结果。孤立的 MSACCESS.EXE 占用了我 25% 的 CPU。它从当时开放的.mdb 中留下了.ldb。如果您有兴趣,我尝试了 VBScript 中的GetObject,但它未能获取孤立的 Access。
猜你喜欢
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
  • 1970-01-01
  • 2021-04-20
  • 2016-02-05
  • 1970-01-01
  • 2012-08-20
相关资源
最近更新 更多