C# Quit()使访问暂时可见

C# Quit()使访问暂时可见,c#,multithreading,office-interop,C#,Multithreading,Office Interop,我正在尝试连接到access DB并检索信息 一切都很顺利,项目几乎完成了,但我需要弄清楚如何退出interop 我首先创建access应用程序,然后确保visible设置为false。(我看不到访问权限)但当我的代码到达行app.Quit()(使用步骤验证)时,访问权限会在屏幕上闪烁,然后再次消失 补充信息:如果我执行了一步,访问窗口不会消失,并且我无法手动关闭它(右上角的红色x)。该应用程序只是重新打开空白。我必须强行关上它 正如您在我注释掉的代码中所看到的,我使用一个进程Kill来确保屏幕

我正在尝试连接到access DB并检索信息

一切都很顺利,项目几乎完成了,但我需要弄清楚如何退出interop

我首先创建access应用程序,然后确保visible设置为false。(我看不到访问权限)但当我的代码到达行app.Quit()(使用步骤验证)时,访问权限会在屏幕上闪烁,然后再次消失

补充信息:如果我执行了一步,访问窗口不会消失,并且我无法手动关闭它(右上角的红色x)。该应用程序只是重新打开空白。我必须强行关上它

正如您在我注释掉的代码中所看到的,我使用一个进程Kill来确保屏幕上没有任何东西闪烁,但这会导致我的应用程序变得不稳定(由于崩溃而创建了如此多的access DB备份)

如果你正在经历正常的(茫然的凝视)。如果你有直觉,请至少让我知道从哪里开始挖掘

static public DataTable ExecuteSQLToDataTable(string sql)
        {
            DataTable dt = new DataTable();

            lock (Locks.AccessDB)
            {
                Microsoft.Office.Interop.Access.Application accApp = new Microsoft.Office.Interop.Access.Application();
                accApp.Visible = false;
                Microsoft.Office.Interop.Access.Dao.Recordset rst = null;
                Microsoft.Office.Interop.Access.Dao.Database cdb = null;


                try
                {
                    accApp.OpenCurrentDatabase(ConnectionDatabase.DatabasePath, false, @"[somepassword]");

                    cdb = accApp.CurrentDb();
                    rst =
                        cdb.OpenRecordset(sql,
                        Microsoft.Office.Interop.Access.Dao.RecordsetTypeEnum.dbOpenSnapshot);
                    rst.MoveLast();
                    int recordCount = rst.RecordCount;
                    rst.MoveFirst();
                    object[,] recordsArray = (object[,])rst.GetRows(recordCount);

                    var rowCount = recordsArray.GetLength(1);
                    var columnCount = recordsArray.GetLength(0);

                    var dtTemp = new DataTable();
                    foreach (Microsoft.Office.Interop.Access.Dao.Field fld in rst.Fields)
                        dt.Columns.Add(fld.Name, typeof(string));

                    foreach (var r in Enumerable.Range(1, rowCount))
                        dt.Rows.Add(Enumerable.Range(1, columnCount)
                            .Select(c => recordsArray[c - 1, r - 1]).ToArray());

                }
                catch
                {
                    //TODO Add catch
                }
                finally
                {

                    GetWindowThreadProcessId(accApp.hWndAccessApp(), out int id);
                    if (rst != null) { Marshal.ReleaseComObject(rst); }
                    if (cdb != null) { Marshal.ReleaseComObject(cdb); }
                    if (accApp != null) { accApp.Quit(); Marshal.ReleaseComObject(accApp); }
                    rst = null;
                    cdb = null;
                    accApp = null;
                    //Process.GetProcessById(id).Kill();

                }

                return dt;
            }
        }
锁是一个静态类
Locks.AccessDB只是一个空对象

我倾向于认为,当您调用all Quit()时,Access正在做一些自己的事情,以便在屏幕上显示自己


您可以通过使用SetWindowPos将访问窗口移出屏幕来解决此问题,这样在调用Quit()时您就不会看到它。

如果我是您,我不会试图杀死它。我会将访问窗口移到看不见的地方(SetWindowPos),然后我就不在乎Quit做什么了。谢谢。这是一个我可以接受的解决办法。我仍然想要一个答案来发展我的理解,但这将为项目做。再次感谢你。没有实际的答案。很明显,关闭访问是为了在屏幕上显示自己。您对此无能为力。根据的答案,我是否仍然可以使用SetWindowPos移动可见性设置为false的窗口?我遇到了和link的OP一样的问题。