耗时任务(或查询)的进度条

时间:2014-06-30 02:11:19

标签: jquery asp.net-mvc-4 signalr

我正在研究MVC4 Web应用程序。此应用程序允许用户与AD进行交互。用户可以使用相同的密码重置密码。然而,整个任务耗费了大量时间。

所以目前,我已经实施了漩涡加载图像来向用户显示任务正在进行。现在,我的客户希望在按钮中显示进度条,如Buttons With Built-in Progress MetersProgress Button Styles所示。

我的想法是从服务器获取进度并更新按钮中的进度样式。我能够在Reporting Server-Side Progress to Web Pages with SignalR的文章的帮助下,通过使用SignalR,发现如何通过使用SignalR向客户报告服务器的进度。

问题现在就开始了。 我无法发现如何衡量重置密码的工作量和剩余的数量

您认为这类解决方案真的可行吗?如果是,请与我分享任何想法或建议。

2 个答案:

答案 0 :(得分:0)

在某些时候你必须将这个问题分解成更小的部分,你想要分解这些部分的程度取决于你需要这个进度条的准确程度以及你需要多少时间或金钱能够花在这个问题上。

对您而言,重置密码的步骤是多少?在我看来,它只是对SetPasswordthere's a good question and answer out there already on this topic)的简单调用,老实说应该很快。追踪我眼前进展的唯一可靠方法可能是在解除SetPassword请求之前反击50%,然后在通话结束后完成100%。

如果您有更多步骤,只需在每个方法完成时跟踪百分比。如果这真的是您唯一的通话,我不确定可靠如何跟踪单个通话的百分比,如SetPassword(如果该通话占用的时间超过一秒或两个你可能还有其他一些导致性能不佳的问题)。无论如何,如果您只有一个呼叫,您将不得不深入挖掘跟踪进度(磁盘上的文件可能表示进一步的进展,网络带宽,内存使用情况等)。

答案 1 :(得分:0)

我在上一个客户的一些项目中做了类似的事情。

我创建了一个小助手类来处理实际的线程。它为我们的Io​​C(Ninject)调用子容器。在该子上下文中,我使用线程范围生存期注册IUpdateProgess接口。这样,下面调用的任何类都将获得相同的IUpdateProgess,但仅针对此特定线程(这不适用于async,因此请记住,不应该成为后台任务的问题)。这样,您可以从链中的任何类注入和更新当前Background工作的进度。 (顺便使用ASP.NET后台工作程序,以便IIS在询问您的工作人员是否正常之前不回收应用程序域。)

IUpdateProgess有一种方法

void Update(double progress); //Ranges from 0 - 1

当触发此方法时,IUpdateProgess的具体实现将在后端总线上触发消息。然后,我使用一个名为SignalR.EventAggregatorProxy的我的小库将这些消息转发给所有侦听特定工作者类型的客户端(在您的情况下,我猜只有一个用户应该得到它)。

您可以在这里查看图书馆 https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/wiki

我写了一篇关于它的博客文章 http://andersmalmgren.com/2014/05/27/client-server-event-aggregation-with-signalr/

此解决方案是抽象和解耦的,任何人都可以订阅进度,后端域或前端客户端。