Создайте событие из пользовательского класса - PullRequest
2 голосов
/ 14 ноября 2011

У меня есть проект службы Windows, предназначенный для мониторинга учетной записи электронной почты и внесения записей в базу данных SQL Server при поступлении определенных сообщений электронной почты.Это переписывание аналогичной программы winforms, которая работает просто отлично, за исключением того, что она требует, чтобы компьютер вошел в учетную запись и программа запустилась вручную, чего я могу избежать, используя его в качестве службы.

Inслужба, которую я поддерживаю в списке зарегистрированных сообщений - в основном, это просто строка и отметка времени, указывающая, что что-то произошло.(Этот список распространяется через службу WCF, но я думаю, что это несущественно, по крайней мере, на данный момент.) В моем пользовательском классе я объявляю публичное событие, а в другом месте я поднимаю это событие.Однако по какой-то причине RaiseEvent не запускается в службе.Например:

Public Class TheService
    Private WithEvents _pc As ProcessorClass

    Public Sub OnStart(ByVal args() As String)
        _pc = New ProcessorClass
    End Sub
    ...
    Private Sub _pc_HandleEvent(LogMessage As String) Handles _pc.CustomEvent
        'do something with the LogMessage
    End Sub
End Class

Public Class ProcessorClass
    Public Event CustomEvent(ByVal LogMessage As String)
    ...
    Public Sub Process()
        'Do stuff
        RaiseEvent CustomEvent("Event raised")
    End Sub
End Class

Проблема в этом случае в том, что _pc_HandleEvent никогда не вызывается.Если я продублирую эту настройку в обычной программе winform, все будет работать как надо.Что я делаю неправильно?Как получить сервис для обработки событий, вызванных другими классами?

1 Ответ

1 голос
/ 14 ноября 2011

Еще немного тестирования, и я решил это. Я пытался вызвать событие в своем конструкторе, но так как он еще не завершил создание (?) Класса, обработчик не был присоединен к этому моменту. Поэтому теперь вместо этого я сначала создаю новый объект, который дает обработчику что-то, за что можно ухватиться, а затем вызываю открытый метод в этом классе, который делает то, что я делал в конструкторе класса. Теперь, когда обработчик зарегистрирован, он перехватывает события по мере их возникновения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...