如何在长服务器进程中显示信息丰富的实时进度数据

我有一个很长的过程可能需要1个小时

这个过程由每年运行的许多步骤组成。我的主要问题是:

如何在过程中向最终用户提供信息性的实时进度,而不仅仅是虚拟加载条

int index=Convert.ToInt32(e.CommandArgument);
bool done=false;
int res=-1;
int fromVal=int.Parse(gv_balance.Rows[index].Cells[0].Text);
int toVal=int.Parse(gv_balance.Rows[index].Cells[1].Text);
int finMonth=1;
int finYear=0;
int-EndServ=0;
int calcYear=int.Parse(gv_balance.Rows[index].Cells[2].Text);
整数合计;
总计=((toVal-fromVal)+1);
string msg=string.Empty;
int confirm=Balance.GetConfirmState(calcYear);
如果(确认==0)
{
RadProgressContext progress=RadProgressContext.Current;
进度。速度=“不适用”;
finYear=fromVal;
for(int i=fromVal;i<=toVal;i++)
{
十进制比率;
//加载新员工
if(toVal-fromVal>0)
{
比率=((十进制)toVal-i)/(toVal-fromVal)*100;
}
其他的
{
比率=((十进制)对val-i)/1*100;
}
progress.PrimaryTotal=总计;
progress.PrimaryValue=总计;
progress.PrimaryPercent=100;
progress.SecondaryTotal=100;//总计;
progress.SecondaryValue=比率;//i;
progress.SecondaryPercent=比率;//i;
progress.CurrentOperationText=“步骤”+i.ToString();
如果(!Response.IsClientConnected)
{
//已单击“取消”按钮或浏览器已关闭,因此停止处理
打破
}
progress.TimeEstimated=(toVal-i)*100;
//暂停当前线程0.1秒
系统线程线程睡眠(100);
EndServ=i+1;
if(i==fromVal)
{   
//--->步骤1
//加载初始数据
int intial=余额。准备数据(calcYear);
//--->步骤2
res=余额。CalcEndServed(calcYear,EndServ-1,6,30);
}
//--->步骤3
int newEmps=平衡。准备员工(calcYear,i);
对于(int j=0;j<2;j++)
{
如果(j==0)
{
最后一个月=7;
finYear=i;
}
其他的
{
finMonth=1;
财政年度=i+1;
}
//--->步骤4
int promotion1=余额。PreparePromotionFirst(财年、财年、财年);
//--->步骤5
int promotion2=余额。准备PromotionSecond(财年、财年、财年);
//--->步骤6
int appointment1=余额。PrepareAppointFirst(财年、财年、财年);
//--->步骤7
内部任命2=余额。准备点秒(财年、财年、财年);
//--->步骤8
int红利=余额。准备基数(财政月、财政年、0、calcYear);
//--->步骤9
int salary=余额。准备薪资(财年、财年、财年);
((复选框)gv_balance.Rows[index].Cells[3].FindControl(“chk_重定向”)。选中==true)
{
//--->步骤9
int acco=余额。准备财务账目(财年、财年、财年);
}
}
//--->步骤10
res=余额。CalcEndServed(calcYear,EndServ,6,30);
平衡。CalcStudy(calcYear);
UpdateProgressContext();
如果(res<0)
{
success_lb.Visible=false;
错误_lb.Visible=真;
error_lb.Text=“error”;
}
其他的
{
完成=正确;
成功可见=正确;
错误_lb.Visible=错误;
success_lb.Text=“success”;
}
}
}

我想显示当前步骤,例如:
(促销1)在-->2018年1月以及整个流程在预计时间之外的百分比

要使用signalR报告一个很长任务的进度,您可以执行以下操作(这只是一个演示如何工作的示例):

服务器部分

我们从映射信号器开始

公共类启动
{
公共无效配置(IAppBuilder应用程序)
{
//任何连接或集线器接线和配置都应位于此处
app.mapsigner();
}
}

我们创建了一个hub类(别忘了安装signar包):

(如果要向所有连接的用户或特定用户组报告进度,请查看此处:http://www.asp.net/signalr/overview/guide-to-the-api/working-with-groups)

在给定的示例中,它仅向Start函数的调用方报告进度

公共类MyHub:Hub
{
公共无效开始(字符串arg)
{
任务运行(()=>
{
AVeryLongTask();
});
}
//模拟长任务
void AVeryLongTask()
{
对于(int i=0;i<10000;i++)
{
睡眠(100);
Clients.Caller.ReportProgress(“AVeryLongTask”,i*100/10000);
}
}
}

客户端部分

在html中,必须添加以下引用:

&lt--脚本引用--&燃气轮机;
&lt--参考jQuery库--&燃气轮机;
<脚本src=”https://stackoverflow.com/questions/37541427/Scripts/jquery-1.6.4.min.js“&gt&lt/脚本>
&lt--参考信号器库--&燃气轮机;
<脚本src=”https://stackoverflow.com/Scripts/jquery.signalR-2.0.0.js“&gt&lt/脚本>
&lt--参考自动生成的信号集线器脚本--&燃气轮机;
<脚本src=”https://stackoverflow.com/signalr/hubs“&gt&lt/脚本>

现在,Js部分将从中心获取进度:

$(函数(){
//声明代理以引用中心。
var hub=$.connection.myHub;
//创建一个中心可以调用以报告进度的函数。
hub.client.reportProgress=函数(函数名,进度){
$(“#progression”)。追加(“<li><strong>”+progression+”</strong>:“+functionName+”</li>);
};
//启动连接。
$.connection.hub.start().done(函数()){
$(“#进程”)。单击(函数(){
//开始漫长的过程
hub.server.start(“arg”);
警报(“启动”);
});
});
});

进度和开始按钮的html容器:

<div class=“container”>
<输入type=“button”id=“process”value=“Send”/>
<ul id=“progression”&gt&lt/ul>
&lt/部门>

如果你需要更多的解释,尽管问吧

(我的例子就是基于这个http://www.asp.net/signalr/overview/getting-started/tutorial-getting-started-with-signalr 来自信号员小组)

发表评论