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

标签 c# vb.net multithreading event-handling

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

我遇到的问题是我在生成工作线程的主线程中有我的事件处理程序。这些工作人员如果出错,会向公共(public)代表提出事件。但是我的主线程没有检测到这些事件,我不知道如何做到这一点。我的意图是进行所有日志记录(文本/数据库)、电子邮件警报和重新启动工作人员以找到另一个没有出错的任务。 (这将在 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

我目前没有收到任何错误提示,应用程序也没有在主线程中命中预期的处理程序。

最佳答案

我使用静态事件来完成你想要的。

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);
    }


}

关于c# - 如何捕获主线程可以监视的多线程应用程序中的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1850229/

相关文章:

c# - 当 .Net Thread 没有名称时,如何使用 NLog 打印 threadid 而不是 threadname?

c# - 为什么临时变量可以阻止客户端删除事件处理程序?

c# - 如何使用 Roslyn 检查属性是否装饰有自定义属性?

c# - 如何仅匹配正则表达式中的第一个数字

c# - 识别矩形

Python Json 和 Python 的多线程/进程组合?

java - 带有 HttpSessionListener 的 session 计数器和 session 计数变量访问

VB.NET:Windows 窗体的默认构造函数在哪里?

vb.net - 将阿拉伯数字转换成英文

xml - 如何让 XML IntelliSense 在 VS 2015 中工作?