- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个控制台应用程序 (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/
有人可以向我澄清主线 DHT 规范中的声明吗? Upon inserting the first node into its routing table and when starting up th
我正在尝试使用 USB 小工具驱动程序使嵌入式设备作为 MTP 设备工作。 我知道 Android 从大容量存储设备切换到 MTP 设备已经有一段时间了,并且找到了 source code for M
我是一名优秀的程序员,十分优秀!