【问题标题】:.NET keep application alive while waiting for task to complete.NET 在等待任务完成时保持应用程序处于活动状态
【发布时间】:2011-04-11 15:02:42
【问题描述】:

我刚刚继承了一个使用生产者-消费者模式的 c# 4.0 WinForms 应用程序(基本上只是一个小仪表板)。我的消费者任务(字面意思是 System.Threading.Tasks.Task)正在处理队列中的数据。当用户想要关闭应用程序时,生产者(TCP 套接字服务器)会立即停止。但是,队列可能不是空的,所以我需要让用户选择立即退出或在消费者任务处理完所有排队数据后立即退出。如果用户想要等待消费者任务完成,UI 自然需要保持响应。我遇到的问题是,由于退出应用程序的代码驻留在“退出”按钮的单击事件处理程序中,我可能需要在单击事件处理程序中等待消费者任务完成。简而言之,事件处理程序包含以下(非常丑陋的)代码:

  // loop while there is still data in the queue
  while (QueuedData.Count > 0)
  {
    Application.DoEvents(); // UI is semi-responsive but with a lot of CPU utilization)
  }

  // the queue is empty so now exit the application

谁能建议另一种实现此功能的方法,这样我就不会陷入 UI 线程上的事件处理程序内部的紧密循环中?此时启动另一个线程/任务来处理此检查然后从该线程关闭应用程序是否有意义?非常感谢!

【问题讨论】:

    标签: .net winforms c#-4.0 task exit


    【解决方案1】:

    您可以有一个退出任务在同一个队列中排队 [通过退出按钮] - 当队列完成时,将调用 Exit 处理程序。

    如果您愿意,您可以同时更新 UI 以显示“退出等待...”。

    【讨论】:

    • 感谢您的建议。我决定实施它。
    【解决方案2】:

    处理关闭事件,取消它,为关闭表单的任务添加延续。

    【讨论】:

      【解决方案3】:

      正如您所提到的,使用这样的循环可能会占用大量 CPU。为什么不充分使用观察者模式:

      • 订阅者将侦听更新并在 BlockingCollection(或任何其他 Blocking 集合)中排队

      • 另一个后台线程将等待上述队列中的项目并在它出现时对其进行处理

      关机时:

      • 您停止发布到队列;

      • 您可以查看队列中有多少项目,并通过 GUI 通知用户,以便用户可以在需要时选择等待强制关闭

      MSDN link on BlockingCollection

      【讨论】:

        猜你喜欢
        • 2018-08-19
        • 1970-01-01
        • 1970-01-01
        • 2014-11-14
        • 1970-01-01
        • 1970-01-01
        • 2012-05-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多