6

拿一个 .Net Winforms 应用程序 .. 混合一个不稳定的无线网络连接,与一些喜欢偶尔拔掉蓝色插头的用户一起搅拌,为了更好的措施,添加一个系统管理员,决定在没有警告的情况下重新启动 SQL 服务器框一次又一次地让每个人都保持警觉。

处理这种情况的建议和策略是什么:

  • 错误处理 - 例如,您是否使用 Try/Catch 包装对服务器的每个调用,或者您是否依赖某种形式的通用错误处理来管理它?如果是这样,它看起来像什么?

  • 应用程序管理 - 例如,您是否禁用应用程序并且在再次检测到连接之前不允许用户与其交互?你会怎么办?

4

6 回答 6

3

答案取决于您的应用程序类型。有些应用程序可以离线工作 - 例如 Microsoft Outlook。此类应用程序不会将连接异常视为关键,它们可以将您的工作保存在本地并稍后同步。网络游戏等其他应用程序会将通信问题视为严重异常,如果连接丢失将退出。

至于错误处理,我认为您应该控制所有层上的异常,而不是依赖一些通用的异常处理代码。您的业​​务层应该了解较低层(在我们的案例中为数据访问层)发生的事情并做出相应的响应。在我看来,连接丢失不应被视为意外异常。对于异常管理的良好实践,我建议查看异常处理应用程序块

关于应用程序行为,您应该回答以下问题“我的应用程序对处于断开状态的客户是否具有商业价值?” 在许多情况下,最终用户能够在断开连接的状态下继续他们的工作将是有益的。然而,这种行为非常难以实施。

特别是针对您的场景 Microsoft 开发的Disconnected Service Agent Application Block

于 2008-09-08T10:59:27.007 回答
2

我已经很多年没有接触过 WinForms 和 .NET,所以我不能给你任何技术细节,但是有一个更大的图片答案:

首先也是最重要的 - 不要将表单数据直接绑定到数据库。

创建一个单独的数据/模型层,将表单小部件绑定到该层。

从那里开始,您可以使用多种选项,具体取决于您需要提供的稳定性和可用性级别。

可能这里最简单的解决方案之一是仅启用/禁用需要根据连接状态与数据库交互的应用程序部分。

下一级保护将包括在本地缓存数据模型的一部分,当数据库连接断开时,使用本地缓存来查看和禁用任何需要显式数据库连接的功能。

可能最棘手的事情(也可能为最终用户提供最稳定的体验)是在本地复制数据库并使用某种同步模式来保持数据库副本与远程数据库同步。

于 2008-09-08T10:47:23.153 回答
1

我们的Main()方法中有这个,它捕获所有未处理的异常......

Application.ThreadException += new 
System.Threading.ThreadExceptionEventHandler(UnhandledExceptionCatcher);

Thread.GetDomain().UnhandledException += new 
UnhandledExceptionEventHandler(Application_UnhandledException);

然后显示用户Application_UnhandledException友好UnhandledExceptionCatcher的消息。

此外,应用程序还会通过电子邮件将堆栈跟踪等数据发送给开发人员,这非常有用。

当然,这取决于应用程序,但对于您描述的那种故障,我会关闭应用程序。

于 2008-09-08T10:35:17.003 回答
1

这对离线场景的支持可能有点过头了,但是你考虑过“微软同步框架”吗?框架中包括“ADO.NET 2.0 的同步服务”,它允许您的应用程序访问本地 SQL Server CE 实例。这可以通过多种方法轻松地与中央 SQL Server 同步。

该框架处理永久离线场景,正如我所说,它可能不适合您的特定要求,但是它将为您的应用程序提供可靠的离线支持。

于 2008-09-08T10:53:33.417 回答
0

在我们的应用程序中,我们为用户提供了连接到另一台服务器的选项,例如,如果数据库连接失败,则会显示一个对话框说服务器不可用,他们可以输入另一个 IP 地址来尝试。

于 2008-09-08T10:30:48.620 回答
0

使用SQLite 之类的东西离线存储数据,直到连接可用。

更新:我相信 SQLite 是Google Gears的后端,据我了解,它可以满足您在网络应用程序中寻找的功能......虽然我不知道它是否可以在非网络环境中使用。

于 2008-09-08T11:14:25.367 回答