Не могу удалить обработчик события в .NET
Когда моё .NET-приложение загружается, оно подписывается на событие DocumentToBeDestroyed и нормально работает.Когда позднее я пытаюсь отписаться от обработки этого события, у меня это не получается и мой обработчик продолжает вызываться.
Вот мой код::
- Imports Autodesk.AutoCAD.Runtime
- Imports Autodesk.AutoCAD.ApplicationServices
- Public Class Commands
- Implements IExtensionApplication
- Public Sub Initialize() Implements IExtensionApplication.Initialize
- AddHandler _
- Application.DocumentManager.DocumentToBeDestroyed, _
- AddressOf docBeginDocClose
- End Sub
- Public Sub Terminate() Implements IExtensionApplication.Terminate
- End Sub
- Public Sub docBeginDocClose( _
- ByVal senderObj As Object, _
- ByVal docColDocActEvtArgs As DocumentCollectionEventArgs)
- System.Diagnostics.Debug.Print("В docBeginDocClose")
- End Sub
- <CommandMethod("StopEvent")> _
- Public Sub StopEvents()
- Try
- RemoveHandler _
- Application.DocumentManager.DocumentToBeDestroyed, _
- AddressOf docBeginDocClose
- Catch ex As Exception
- End Try
- End Sub
- End Class
Решение:
AutoCAD создаёт экземпляр класса, который содержит метод Initialize(). Если функция команды – это функция экземпляра класса (т.е. не имеет атрибутов static/shared), в этом случае AutoCAD создаёт новые экземпляры этого класса, содержащего эту функцию, для каждого из открытых документов. Если обработчик события тоже функция экземпляра класса, тогда вы получаете её экземпляр соответствующий тому экземпляру класса, что и обработчик вызванной команды.
Таким образом вы подключаетесь к событию внутри Initialize() или команды, и пытаетесь потом отключить другой экземпляр функции-обработчика, который не подписан на событие, а тот который подписан на событие при этом не отписывается.
Вот поэтому обработчик события продолжает вызываться даже если мы пытаемся его отписать от события.
Таким образом простейшим решением является указать функцию обработчик как статическую (static (C#) / Shared (VB.NET)):
- Public Shared Sub docBeginDocClose( _
- ByVal senderObj As Object, _
- ByVal docColDocActEvtArgs As DocumentCollectionEventArgs)
- System.Diagnostics.Debug.Print("В docBeginDocClose")
- End Sub
Источник: http://adndevblog.typepad.com/autocad/2012/07/cannot-remove-net-event-handler.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=3071
Опубликовано 02.10.2015Отредактировано 02.10.2015 в 22:12:21