代码之家  ›  专栏  ›  技术社区  ›  RiddlerDev

如何在多线程应用程序中捕获主线程可以监视的事件?

  •  2
  • RiddlerDev  · 技术社区  · 16 年前

    我有一个控制台应用程序(VB.NET)。启动时,它生成工作线程,在数据库中查找工作并执行任务,然后查找下一个任务(基本上是工作流)。

    我遇到的问题是,我的事件处理程序位于生成工作线程的主线程中。这些工作人员如果出错,将向公共委托引发事件。然而,我的主线程并没有检测到这些事件,我也不知道如何实现它。我的目的是完成所有日志记录(文本/数据库)、电子邮件警报,并重新启动worker以找到另一个没有出错的任务(这将在LogErrorMessage例程中进行扩展,目前我只是将其保留为一个简单的控制台。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
    

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

    2 回复  |  直到 16 年前
        1
  •  1
  •   Crispy    16 年前

    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);
        }
    
    
    }
    
        2
  •  0
  •   Ryan    16 年前

    工人基地 : Private _Log As **New** EventLogger

    _ErrorLogger 或传递处理程序的地址。由于您正在WorkerBase中自动创建EventLogger的新实例,因此新的日志实例没有连接事件处理程序。请注意,处理程序中可能存在您必须处理的多线程问题。