COMException произошла в IConnectionPoint Unadvise()

Я разрабатываю программу, которая проверяет, подключено ли приложение Windows Form к Интернету или нет.

Я основал свой код по следующей ссылке:

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

Я получаю это исключение System.Runtime.InteropServices.COME в методе Unadvise() класса IConnectionPoint, и я не уверен, почему.

Вот дополнительная информация об исключении:

Для этого идентификатора соединения нет соединения (Исключение из 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();
}

Кто-нибудь знает, почему я получаю это исключение?

1 ответ

Решение

Теперь я вижу, в чем проблема!

После отладки я заметил, что когда Application.Exit() выполняется, он снова вызывает событие SQLiteForm_FormClosing. Поскольку Unadvise() уже выполнен, он генерирует исключение OLE_E_NOCONNECTION.

Я решил это, переместив Application.Exit() в событие SQLiteForm_FormClosed как таковое:

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

Таким образом, он больше не будет вызывать событие SQLiteForm_FormClosing, так как форма уже закрыта.

Другие вопросы по тегам