我正在开发MVC4网络应用程序。此应用程序允许用户与AD交互。用户可以使用相同的密码重置他们的密码。然而,整个任务消耗了大量的时间。
因此,目前,我已经实现了漩涡加载图像来显示用户正在执行的任务。现在,我的客户想在按钮本身中显示进度条,如这里所示,带有内置进度表的按钮或进度按钮样式。
,我的想法是从服务器获取进度,并在按钮中更新进度样式。我能够了解如何在SignalR的帮助下通过用SignalR向网页报告服务器端进度向客户端报告服务器上的进度。
问题现在开始了,,我无法了解如何度量已经完成了多少重置密码的任务,以及还剩下了多少。
那么,你认为这类解决方案真的可行吗?如果是,请与我分享任何想法或建议。
发布于 2014-06-29 18:58:26
在某种程度上,你必须把这个问题分解成更小的部分,而你想要分解这些问题的程度取决于你需要这个进度条有多精确,以及你能在这个问题上花费多少时间或金钱。
对你来说,重置密码有几个步骤?在我看来,这是对SetPassword
(在这个话题上已经有了一个很好的问题和答案)的简单调用,老实说,这应该是相当快的。跟踪我眼中的进展的唯一可靠方法可能是在启动SetPassword
请求之前将计数器撞到50%,然后在调用结束后完成100%。
如果有更多的步骤,只需在每个方法完成时跟踪一个百分比。如果这确实是您唯一的调用,我不知道如何可靠地跟踪单个调用的百分比,如SetPassword
(如果调用花费超过一两秒钟,您可能会遇到其他问题,导致性能如此差)。无论如何,在只有一个调用的情况下,您必须深入挖掘以跟踪进度(可能磁盘上的文件表示进一步的进度、网络带宽、内存使用等)。
发布于 2014-06-30 02:45:32
在我最后一个客户的一些项目中,我做了一些类似的事情。
我创建了一个小助手类来处理实际的线程处理。它为我们的IoC (Ninject)调用一个子容器。在该子上下文中,我注册了一个具有线程作用域生存期的IUpdateProgess
接口。这样,下面调用的任何类都将得到相同的IUpdateProgess
,但只对这个特定的线程(这将不适用于async
),因此请记住,对于后台任务来说不应该是一个问题。通过这种方式,您可以从链中的任何类注入和更新当前后台工作的进度。(顺便说一句,使用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/
这个解决方案是抽象和解耦的,任何人都可以订阅进度、后端域或前端客户端。
https://stackoverflow.com/questions/24482127
复制