我应该在后台线程中运行所有内容吗?

时间:2010-02-15 18:58:40

标签: wpf multithreading architecture backgroundworker long-running-processes

我正在设计一个在等待来自服务器(数据库或互联网)的数据时有可能挂起的应用程序,问题是我不知道如何最好地处理大量不同的地方,事情可能需要时间。

我很高兴在访问发生时向用户显示“加载”对话框,但理想情况下我不希望这种情况向上移动并在短时间运行时消失。

微软的话似乎可以很好地处理这个问题,就好像你单击一个按钮并且操作需要很长时间,几秒钟后你就会得到一个“工作......”对话框。操作仍然是同步的,您无法中断操作。但是,如果快速发生相同的操作,您显然无法获得对话框。

我很高兴(ish)设计一些通用的后台工作线程处理程序,我的数据处理的99%已经在静态原子方法中完成了,但如果可以的话,我想在这个上做最好的练习。

如果有人有模式,代码或建议我欢迎他们

干杯

3 个答案:

答案 0 :(得分:3)

我肯定会认为使用带有2个事件的模式是异步的。第一个“事件”是您实际从任何地方/何时等待它获取数据。第二个事件是延迟计时器。如果你在这个计时器弹出之前得到你的数据,一切都很好。如果没有,那么你弹出“我很忙”并允许他们取消请求。通常取消只是意味着“忽略”当你最终得到答案时。

答案 1 :(得分:1)

  

微软的话似乎可以很好地处理这个问题,就好像你单击一个按钮并且操作需要很长时间,几秒钟后你就会得到一个“工作......”对话框。操作仍然是同步的,您无法中断操作。但是,如果快速发生相同的操作,您显然无法获得对话框。

如果这是您想要的行为......

你可以通过在BackgroundWorker周围包装一个类来轻松地处理这个问题。只是开始DoWork事件的时间,以及第一个进度报告的时间。如果经过一段时间,您可以显示对话框 - 否则,阻止(因为这是一个简短的过程)。

话虽这么说,每当你做可以异步处理的工作时,我建议你这样做。永远阻止你的用户界面在一个明显的间隔,即使它很短,这是更好的。通过使用task parallel library,在.NET 4(或带有Rx框架的3.5)中,这变得更加简单。

答案 2 :(得分:0)

理想情况下,您应该在后台线程中或异步地运行任何IO或非UI处理,以避免锁定UI。