【发布时间】:2008-12-16 20:27:38
【问题描述】:
我的应用程序的一个要求是,如果它失去数据库连接,那么它必须弹出一个大模式“无连接。稍后再试”对话框,阻止所有用户交互,直到重新连接。
我通过在应用程序开始时启动 DeviceMonitor 类的实例来实现这一点。此类创建一个 System.Threading.Timer 和每个 Tick(通常为 1 秒)以及它尝试从数据库中提取数据的一些其他内容。如果抽签失败并且确定原因是由于缺乏连接,则通过弹出上述对话框来处理异常。同样,如果数据获取成功并且对话框当前处于打开状态,则它会被强制关闭。
问题在于,尽管这一切正常,但 ConnectionLost 对话框并没有阻止用户与 UI 交互。这是有道理的,因为 Timer.Elapsed 事件在其自己的线程中引发,并且从回调中调用 noConnectionDialog.ShowDialog() 会阻塞它所在的线程,但不会阻塞 UI 线程。
据我了解,我需要强制 noConnectionDialog.ShowDialog() 在 UI 线程中运行或阻塞 UI 线程,直到调用 noConnectionDialog.Hide() 但我也不知道该怎么做。
也许还有其他补救措施,或者我在这里遗漏了一些东西。任何建议表示赞赏。
编辑: 更多信息 - 这是一个程式化的对话框,而不仅仅是一个消息框。它是在我的应用程序由 Castle Windsor 启动并注入到传递的 DialogFactory 类时创建的。因此,该对话框由
访问var d = _dialogFactory.GetNoConnectionDialog();
d.ShowDialog();
我已经尝试将此代码放在计时器经过的回调之外 - 例如,当单击 UI 界面上的按钮时 - 它会从那里很好地阻止 UI,因此这与创建表单的位置无关。
【问题讨论】:
标签: .net winforms multithreading