2009-11-24 104 views
1

在应用程序中执行长时间操作时,如何从业务层向用户界面提升信息?长时间运行状态

活动? 传入挂钩到UI的状态对象?

在我开始之前,我只是想知道你们男孩和女孩有什么狡猾的想法。

+0

而嵌套操作又如何呢?调用一个主函数调用多个子函数,每个函数提供进度并可以自己调用。 – 2009-11-24 09:44:46

+0

我已经写了一些代码在这里,你可以在这里找到它http://www.antix.co.uk/A-Developers-Blog/Long-Operation-Status – 2009-11-27 10:05:17

回答

1

有两种方法,我通常这样做:

  1. 与事件推数据。很简单,长方法知道它做了多少,每当它完成一块它引发一个事件,并推动数据到用户界面。
  2. 轮询。假设该方法用于读取文件。它会随时更新某个属性,并且UI将每100-200ms轮询一次该属性以更新进度。 100-200ms的原因是低于用户不会注意到的,只会减慢操作速度;更高,并且进展会'笨重'。
+0

我发现投票也非常有效。大部分事件都可以正常工作,但是如果必须同步线程,它们会减慢运行的代码速度,所以请谨慎使用事件,仅在外部/更大的循环中使用。 – invert 2009-11-24 14:54:46

+0

只有在事件发生得太快的情况下,投票才是好事,我想。请注意,事件不必减慢代码,因为它们可以在自己的线程中引发,并且如果去UI应该使用BeginInvoke而不是Invoke() – configurator 2009-12-02 12:01:59

0

你应该区别:这可以在GUI-app中完成,这需要批量完成。

运行5分钟的东西:在您的gui-app或批处理中?

+0

这将是一个应用程序与GUI和商业层做的工作 – 2009-11-24 09:21:50

+0

好的,非常好。但是我想说的是:如果你认为这个过程运行时间太长,那么批量完成所有工作可能会更好。 – Natrium 2009-11-24 10:56:24

+0

谢谢但不是,这是一个关于向用户提供反馈的问题,具体不使用批处理 – 2009-11-24 11:41:52

0

如果我们考虑一个典型的Web应用程序 - 不使用COMET等推送技术,更新后的信息将被浏览器间歇地提取,也许在用户请求时(可能是在进行AJAX后台调用时)。

在这种情况下,我有我的服务提供状态操作。

int requestSomeWork(... data ...) ; // returns an id 

Status getStatus(int id); // tell me about a previously submitted request 

此样式不仅用于显示进度信息,还用于从故障情景中恢复。我可以提供更多的方法,使我们能够确定发生了什么,如果浏览器或服务器崩溃,正如我们正在创建一个请求

int[] findRequest(... search Criteria ...); // I think I submitted a request like ... what's its id? 

如果我们有一个“活”的用户界面,无论是胖客户端或彗星那么我们可以添加事件处理

void registerForUpdates(id, callMe); 
0

这似乎正是事件的设计。让其他对象知道对该对象的更改。

有一个ProgressUpdated事件报告进度百分比或者沿线的事情是我该怎么做。

+0

ok,那么如何通过方法传递引发事件的对象,如IncrementStatus()。这样你可以有一个对象,你可以再次使用不同的对象进行不同的操作,并让UI连接到它? – 2009-11-24 10:23:46