COMException 发生在 IConnectionPoint Unadvise()

COMException occurred in IConnectionPoint Unadvise()

我正在开发一个程序来检查 Windows 表单应用程序是否已连接到互联网。

我的代码基于以下 link:

https://www.codeproject.com/Articles/34650/How-to-use-the-Windows-NLM-API-to-get-notified-of

我在 class 的 Unadvise() 方法中得到这个 System.Runtime.InteropServices.COMException IConnectionPoint 我不确定为什么。

异常的附加信息如下:

There is no connection for this connection ID (Exception from HRESULT: 0x80040004 (OLE_E_NOCONNECTION))

这是调用 Advise() 的方法:

private INetworkListManager nlm;
private IConnectionPoint icp;
private int cookie = 0;

public void AdviseNetworkListManager()
{
    try
    {
        IConnectionPointContainer icpc = (IConnectionPointContainer)nlm;
        Guid guid = typeof(INetworkListManagerEvents).GUID;
        icpc.FindConnectionPoint(ref guid, out icp);
        icp.Advise(this, out cookie);
    }
    catch (Exception e)
    {
        throw new Exception(e.Message);
    }
}

这是调用 Unadvise() 的方法:

public void UnadviseNetworkListManager()
{
    icp.Unadvise(cookie);
}

下面是调用上述两种方法的构造函数和事件:

private NetworkHelper netHelper;

public SQLiteForm()
{
    InitializeComponent();
    SQLiteDatabase.ConnectDB();
    DBHelper.ConnectDB();
    netHelper = new NetworkHelper();
    netHelper.AdviseNetworkListManager();
    netHelper.DoBackgroundWork += backgroundWorker_DoWork;
}

private void SQLiteForm_FormClosing(object sender, FormClosingEventArgs e)
{
    netHelper.UnadviseNetworkListManager();
    DBHelper.DisconnectDB();
    SQLiteDatabase.DisconnectDB();
    Application.Exit();
}

有谁知道我为什么会收到此异常?

我明白是什么问题了!

调试时,我注意到当执行 Application.Exit() 时,它会调用 SQLiteForm_FormClosing 事件再次发生。由于 Unadvise() 已经执行,它抛出 OLE_E_NOCONNECTION 异常。

我通过将 Application.Exit() 移动到 SQLiteForm_FormClosed 事件解决了这个问题:

private void SQLiteForm_FormClosed(object sender, FormClosedEventArgs e)
{
    Application.Exit();
}

这样它就不会再调用 SQLiteForm_FormClosing 事件,因为表单已经关闭。