2011-11-14 10 views
2

電子メールアカウントを監視し、特定の電子メールが到着したときにSQL ServerデータベースにエントリするWindowsサービスプロジェクトがあります。これは、コンピュータをアカウントにログインさせ、プログラムを手動で起動する必要があることを除いて、正常に動作する同様のwinformsプログラムを書き直したものです。これをサービスとして使用することで回避できます。カスタムクラスからイベントを呼び出す

サービスでは、ログに記録されたメッセージのリストを保持しています。基本的には文字列とタイムスタンプで、何かが発生したことを示しています。 (そのリストはWCFサービス上で共有されていますが、少なくとも現時点ではそれは重要ではないと思います)。私のカスタムクラスでは公開イベントを宣言しています。ただし、何らかの理由でがサービスで実行されていません。例:

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

もう少しテストして解決しました。私はコンストラクタでイベントを発生させようとしていましたが、クラスの構築が完了していないので、その時点でハンドラはアタッチされませんでした。だから代わりに私は最初に新しいオブジェクトを作成します。これはハンドラに何かをつかんで、そのクラスのpublicメソッドを呼び出して、クラスコンストラクタで行っていたことを行います。ハンドラが登録されたので、イベントが発生したときにイベントをキャッチします。

関連する問題