1

我有一个在工作线程上启动 SQL 批处理的主 UI 线程。

批处理可能会产生一些错误(阻塞)或警告(非阻塞)。

在第一种情况下,我最终回滚事务并退出线程。

在第二种情况下,我希望用户在 SQL 批处理中间查看警告消息:

  1. 一些数据被处理
  2. 产生了一些警告
  3. 用户评论这些消息
  4. 用户决定继续或停止批处理
  5. 批处理恢复或停止

我可以ShowDialog()直接从工作线程中创建一个,但我不喜欢这个解决方案,因为这不是一个 UI 线程。

我的想法是通知主 UI 线程有关情况(“已生成警告”)并让工作线程休眠一段固定的时间(比如 500 毫秒)。bool?每次线程唤醒时都会检查一个三态 ( ),如果它没有值,则线程再次休眠。

当用户查看警告并可能决定继续时,设置布尔值,下次工作线程唤醒时,它将知道是继续还是安全中止(回滚)批处理。

这是一个如此糟糕的设计模式吗?

4

3 回答 3

4

如果你改变“唤醒”机制,这个概念还不错。

与其使用 abool?和周期性地自行唤醒工人,不如使用 abool和 a ManualResetEvent。worker 通知 UI 并等待事件(立即阻塞)。UI 与用户交互,bool适当地设置并发出事件信号(释放工作人员,检查bool值并采取相应措施)。

当然,上面可以通过多种方式实现,实现方式留有相当大的工程空间。在规模的一端,您可以将代码与原始标志和事件紧密耦合,而在另一端,您可以拥有工作人员查询的抽象“反馈服务”。

这将使您能够将反馈服务的一种实现换成另一种实现,其中允许:

  1. 提供“对所有警告执行此操作”选项;如果它被选中,反馈服务将停止显示请求的 UI,而是在内部回答它们。
  2. 以“静默模式”执行操作:反馈服务被配置为在不显示 UI 的情况下回答请求(例如,总是说“继续”)。
于 2013-06-07T09:06:57.197 回答
2

我会使用事件来做到这一点。像这样:

  1. 创建一个 AutoResetEvent 作为类成员变量
  2. 需要使用交互时,先重置事件
  3. 通知主 UI 线程
  4. 等待事件

在主线程中:

  1. 显示警告/错误。
  2. 存储用户选择的内容。
  3. 设置事件。

现在,工作线程将唤醒并获取主线程的结果(用户选择的内容)并继续。

于 2013-06-07T09:07:47.333 回答
1

与其使用bool?,为什么不使用一些锁定机制呢?ManualResetEvent例如可以阻塞线程,直到用户决定。比他的决定可以设置这个事件,导致线程继续工作。它应该继续工作的方式应该在另一个变量中传递,以明确区分阻塞机制和有关如何继续执行的信息。

于 2013-06-07T09:08:22.243 回答