应用程序退出后仍重现MSACCESS.EXE进程仍在运行

时间:2014-02-10 21:25:07

标签: vba ms-access access-vba

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

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


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

1 个答案:

答案 0 :(得分: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。

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

任何Application.Quit命令都会调用垃圾收集器,如果该命令在另一个Form上,则无关紧要。

Application.Quit命令调用垃圾回收器后,所有变量都已重置。 然后,Application.Quit命令启动关闭序列。 如果任何表格已打开,则尝试关闭它。 如果表单具有Form_Close或Form_Unload事件,则会触发这些事件。 当Application.Quit命令调用这些事件时,PersistentRecordset已经关闭了。

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

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

克里斯。


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