.NET在等待任务完成时使应用程序保持活动状态
我刚刚继承了一个使用生产者 - 使用者模式的c#4.0 WinForms应用程序(基本上只是一个小仪表板)。我的消费者任务(字面上是System.Threading.Tasks.Task)正在处理队列中的数据。当用户想要关闭应用时,生产者(TCP套接字服务器)立即停止。但是,队列可能不是空的,因此我需要给用户立即退出的选项,或者消费者任务完成处理所有排队数据后立即退出。如果用户想要等待消费者任务完成,那么UI自然需要保持响应。我遇到的问题是,因为退出应用程序的代码驻留在“退出”按钮的单击事件处理程序中,所以我可能需要等待消费者任务完成,而我处于单击事件处理程序中。概括地说,事件处理程序包含这一(非常难看)代码:.NET在等待任务完成时使应用程序保持活动状态
// 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实现该功能的另一种方式线?在此时启动另一个线程/任务来处理此检查,然后关闭该线程中的应用程序会有什么意义吗?非常感谢!
您可以有一个退出任务,该退出任务在[退出按钮] 的同一队列中排队 - 当队列结束时,将调用Exit处理程序。
如果您愿意,您可以在此期间更新UI以说'Exit pending ...'。
处理关闭事件,取消它,将关闭事件添加到表单。
也使用这样的循环可能会相当CPU密集,因为你已经提到。为什么不使用Observer模式充分让:
用户将监听更新,并在BlockingCollection排队它(或任何其它封闭的集合)
另一个后台线程将等待项目上述队列并对其进行处理,因为它沿着
亮起关机:
你停止发布到队列中;
你可以找到你在队列中有多少个项目获得,并通过GUI通知,所以如果需要
感谢您的建议,用户可以选择等待强制关闭。我决定实施它。 – user685869 2011-04-13 12:57:44