3

Stack Overflow 上已经有一些关于这个主题的非常好的主题,但似乎并没有一个简洁的答案。我的 C# 控制台应用程序(作为 Windows 服务运行)启动 Java 进程并对其进行管理(启动/停止/重新启动它),但我的问题是我将远程进入机器,并且有时会看到它启动了大约 20 个 Java 进程。

这显然是我的应用程序在某个时候崩溃的问题,并且没有关闭它启动的 Java 进程。我在 AppDomain.CurrentDomain 中挂上了“UnhandledExceptionEventHandler”,并从中调用 TerminateProcess()(关闭活动的 Java 进程),但这个问题仍然偶尔发生。

我的应用程序有主线程、一个 TCP 服务器线程(它接受异步连接)和一个 UDP 服务器线程。在 UnhandledException 之上还有什么我应该挂钩的吗?

编辑

我还突然想到,我的代码中有几个 Try/Catch 块,它们只是写入控制台,而我从未见过。我应该删除这些以便它们被 UnhandledException 捕获还是在那里添加一个记录器?

4

2 回答 2

1

首先,如果您不想记录,则必须将Console.WriteLine..代码中的行更改为,因此它的输出只会在调试时出现。Debug.WriteLine..

其次,如果发生任何异常,如果您不知道如何处理或修复它,然后catch { throw; }在记录后重新抛出它。我个人做

try
{
    ...
}
catch (Exception exception)
{
    Log(exceptiosn);//log it first or Debug.WriteLine...
#if DEBUG
    System.Diagnostics.Debugger.Break();//break at the debugger here.
#endif//DEBUG
    throw;
} 

清理代码后,现在无论何时DomainUnhandledException抛出,都可以重新启动应用程序。这里有一个例子,想法是你从你的应用程序中启动一个新实例,然后终止第一个实例。您还定义了一个互斥锁,因此一次只有一个实例处于活动状态。

于 2011-07-31T08:10:15.613 回答
0

需要考虑的是您是否希望 .NET 应用程序负责生成的进程。如果可能,他们可能会在不再接收输入时负责关闭。如果生成的进程正在其他机器上运行,我无论如何都会尝试这样做,因为网络问题可能会干扰从 .NET 应用程序向 Java 进程发送关闭消息。每个人都有自己的责任。

也就是说,修复 .NET 应用程序中的异常处理(尤其是当您丢失一些异常时)也很重要。让每个线程对其异常负责,并确保记录它们以便于调试。

于 2011-07-31T08:05:24.233 回答