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, так как форма уже закрыта.