gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:33:51 24 4
gpt4 key购买 nike

我有一个控制台应用程序 (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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com