2009-12-04 47 views
2

我有一個控制檯應用程序(VB.NET)。當它啓動時,它會派生工作線程來查找數據庫中的工作並執行任務,然後查找下一個任務(基本上,工作流程)。如何捕捉可以被主線程監視的多線程應用程序中的事件?

我遇到的問題是我在生成工作線程的主線程中有我的事件處理程序。那些工作人員,如果他們錯誤的話,會向公衆代表舉辦一個活動。然而,我的主線沒有檢測到這些事件,我無法弄清楚如何製作它。我的意圖是執行所有日誌記錄(文本/數據庫),電子郵件警報,並重新啓動工作人員以查找另一個未出錯的任務。 (這將在LogErrorMessage例程中進行擴展,現在我只保留一個簡單的Console.Writeline,以便我可以看到該方法是否被觸發)

可以這樣做嗎?如果是的話......我錯過了什麼?

這裏是圍繞什麼,我試圖做的代碼:

記錄器類:

Public Delegate Sub LogDelegateError(ByVal Ex As Exception) 

Public Class EventLogger 
    Public Event EventError As LogDelegateError 

    Public Sub New() 
    End Sub 

    Public Sub LogError(ByVal ex As Exception) 
     RaiseEvent EventError(ex) 
    End Sub 
End Class 

主線:

Private WithEvents _ErrorLogger As EventLogger 

Public Sub Process() 
    _ErrorLogger = New EventLogger 
    AddHandler _ErrorLogger.EventError, New LogDelegateError(AddressOf LogErrorMessage) 

    [Loop] 
    Dim tWorker As Thread = New Thread(AddressOf oWorker.MainProcess) 
    tWorker.Priority = WorkerNode.Attributes(SETTING_NAME_PRIORITY).Value 
    tWorker.Start() 
    [End Loop] 

    [In Finally] 
    RemoveHandler _ErrorLogger.EventError, New LogDelegateError(AddressOf LogErrorMessage) 
End Sub 

Private Sub LogErrorMessage(ByVal ex As Exception) Handles _ErrorLogger.EventError 
    Console.WriteLine() 
    Console.WriteLine("INTERNAL ERROR:") 
    Console.WriteLine(ex.ToString()) 
    Console.WriteLine() 
End Sub 

WorkerBase:

Private _Log As New EventLogger 
Public Sub MainProcess() 
    Try 
      [SOME WORK] 
    Catch ex As Exception 
      Me._Log.LogError(ex) 
    End Try 
End Sub 

我目前沒有發現有什麼錯誤的錯誤,應用程序也沒有在主線程中擊中預期的處理程序。

回答

1

我使用一個靜態事件來完成你想要的。

C#代碼示例,對不起。如果你完成了一個對象(下面的例子中的Main),記得刪除事件,否則它會導致內存泄漏,並且永遠不會收集垃圾。

public class WorkerClass 
{ 
    public static event ProgressInfoEventHandler ProgressInfo; 

    private static void OnProgressInfo(string message) 
    { 
     if (ProgressInfo != null) 
      ProgressInfo(new ProgressInfoEventArgs(message)); 
    } 

    private void DoWork() 
    { 
      OnProgressInfo("Doing some work"); 
    } 

} 

主要或記錄線程/類:

public class Main 
{ 
    public Main() 
    { 
     WorkerClass.ProgressInfo += 
      new ProgressInfoEventHandler(WorkerClass_ProgressInfo); 
    } 

    void WorkerClass_ProgressInfo(ProgressInfoEventArgs e) 
    { 
     //LogMessage(e.Message); 
    } 


} 
+0

C#很好,我更喜歡它,僱主選擇VB出於某種原因。讓我試試這個! – RiddlerDev

+0

該事件將被提出並處理,儘管它不會在主線程中處理,而會在提升它的線程中處理。 –

+0

@Yann,那很好。 @克里斯,工作!謝謝。 – RiddlerDev

0

WorkerBasePrivate _Log As **New** EventLogger

您需要的_ErrorLogger參考傳遞給WorkerBase實例或通過處理程序的地址。由於您在WorkerBase中自動創建EventLogger的新實例,因此新的_Log實例沒有連接事件處理程序。請注意,處理程序中可能存在多線程問題,您必須處理這些問題。

+0

再次,我的遺漏。構造函數傳入記錄器並將私有對象設置爲該實例。 – RiddlerDev