我对程序架构/设计有几个问题 1.我完全重构了我的一个程序,该程序的目的是将文件从客户端传输到服务器端(如丢弃框或网络柜)。它可以根据配置创建多个客户端,全部在窗口服务下。 让我们看一下开始代码:
public class Master
{
private List<Box> _boxes = new List<Box>();
public Master()
{
Initialize(); ...
}
public void Run()
{
foreach(var box in _boxes)
{
box.Run();
}
}
}
每个Box类都是&#34; Living&#34;由它自己,但如果其中一个失败与非托管异常然后整个服务丢失,或通过更好地管理资源。我的想法是窗口服务是主类,它将以不同的Process
或appDomain
类开始Box的数量。
P.S。 你们中的任何人还看不到Google Chrome浏览器中的箭头和StackExchange链接吗?
答案 0 :(得分:1)
为什么不处理任何例外?
public void Run()
{
foreach(var box in _boxes)
{
try { box.Run(); }
catch(Exception ex){ /* handle exception */ }
}
}
答案 1 :(得分:1)
我在这里看到两个基本决定。
首先,Box的故障模式是否需要重新启动运行的整个过程?
然后,如果存在这样的故障模式,我们可以通过将Box分成它们自己的过程空间来限制故障模式的影响吗?那我们应该增加隔离度以提高整体稳定性吗?
隔离原则非常普遍,例如在Java EE应用服务器中,我们可能会故意选择将某些应用程序与其他应用程序隔离,因为某些应用程序不稳定 - 不稳定的JNI代码往往会导致整个过程崩溃。
我认为通常需要这种隔离,因为我们有理由不相信某些代码。现在,在你的情况下,你正在编写Box,是否真的无法捕获所有异常并处理它们?即使Box需要停止也不能解决问题并启动新实例吗?
所以我试图强化我的Box类,这样就不需要隔离了。
答案 2 :(得分:1)
您不能在try/catch
中使用单foreach
因为您在调用Box
时正在box.Run()
类中运行线程,但是您应该预测其中的异常Box
类并在那里处理它们,但是如果你无法这样做“可能是因为你调用另一个自己运行某些线程的第三方库,这可能会导致异常”,那么它是您可以选择在不同的应用程序域中创建和运行每个框吗? here如何做到这一点,通过这样做,您可以通过处理每个框的应用程序域异常来单独处理每个框异常:
myBoxDomain.UnhandledException += OnCurrentDomain_UnhandledException;
所以你可以在这里处理每个盒子的失败而不影响其他盒子。