在一个很长的服务器进程中如何显示信息量很大的实时进度数据我有一个这么长的进程,可能需要1个小时。此过程包括每年运行的许多步骤。我的主要问题是:如何在整个过程中为最终用户提供信息丰富的实时进度,而不仅仅是虚拟加载栏。intindex=Convert.ToInt32(e.CommandArgument);布尔完成=假;intres=-1;intfromVal=int.Parse(gv_balance.Rows[index].Cells[0].Text);inttoVal=int.Parse(gv_balance.Rows[index].Cells[1].Text);intfinMonth=1;intfinYear=0;int结束服务=0;intcalcYear=int.Parse(gv_balance.Rows[index].Cells[2].Text);总计;总计=((toVal-fromVal)+1);字符串味精=string.Empty;intconfirm=Balance.GetConfirmState(calcYear);if(confirm==0){RadProgressContextprogress=RadProgressContext.Current;progress.Speed="N/A";finYear=fromVal;对于(inti=fromVal;i0){ratio=((decimal)toVal-i)/(toVal-fromVal)*100;}else{ratio=((decimal)toVal-i)/1*100;}progress.PrimaryTotal=总计;progress.PrimaryValue=总计;progress.PrimaryPercent=100;progress.SecondaryTotal=100;//全部的;progress.SecondaryValue=ratio;//i;progress.SecondaryPercent=比率;//我;progress.CurrentOperationText="步骤"+i.ToSt戒指();if(!Response.IsClientConnected){//取消按钮被点击或浏览器关闭,停止处理break;}progress.TimeEstimated=(toVal-i)*100;//停止当前线程0.1秒System.Threading.Thread.Sleep(100);终端服务=i+1;if(i==fromVal){//--->STEP1//加载初始数据intintial=Balance.PrepareIntialData(calcYear);//--->STEP2res=Balance.CalcEndServed(calcYear,EndServ-1,6,30);}//--->STEP3intnewEmps=Balance.PrepareNewEmployees(calcYear,i);for(intj=0;jSTEP4intpromotion1=Balance.PreparePromotionFirst(finYear,finMonth,calcYear);//--->STEP5intpromotion2=Balance.PreparePromotionSecond(finYear,finMonth,calcYear);//--->STEP6intappointment1=Balance.PrepareAppointmentFirst(finYear,finMonth,calcYear);//--->STEP7intappointment2=Balance.PrepareAppointmentSecond(finYear,finMonth,calcYear);//--->STEP8intbonus=Balance.PrepareBonus(金融月,finYear,0,calcYear);//--->STEP9intsalary=Balance.PrepareSalary(finYear,finMonth,calcYear);(((CheckBox)gv_balance.Rows[index].Cells[3].FindControl("chk_redirect")).Checked==true){//--->STEP9intacco=Balance.PrepareFinanceAccount(finYear,finMonth,calcYear);}}//--->第10步res=Balance.CalcEndServed(calcYear,EndServ,6,30);Balance.CalcStudy(calcYear);UpdateProgressContext();如果(res<0){success_lb.Visible=false;error_lb.Visible=true;error_lb.Text="错误";}else{完成=真;success_lb.Visible=true;error_lb.Visible=false;success_lb.Text="成功";我想通过示例显示当前步骤:((Promotion1)in--->1-2018和整个过程中估计时间旁边的百分比要使用signalR报告一个非常长的任务的进度,你可以这样做(这只是一个例子来展示它是如何工作的):服务器部分我们从映射SignalR开始。publicclassStartup{publicvoidConfiguration(IAppBuilderapp){//任何连接或集线器连接和配置都应该放在此处app.MapSignalR();我们创建一个集线器类(不要忘记安装signalr包):(如果你想为所有连接的用户或特定用户组报告进度,请参见此处:http://www.asp.net/signalr/overview/guide-to-the-api/working-with-groups)在给定的示例中,它仅向Start函数的调用方报告进度。publicclassMyHub:Hub{publicvoidStart(stringarg){Task.Run(()=>{AVERyLongTask();});}//模拟一个长任务voidAVeryLongTask(){for(inti=0;i客户端部分在html中,你必须添加以下引用:现在Js部分从中心获取进度:$(function(){//声明一个引用集线器的代理。varhub=$.connection.myHub;//创建一个集线器可以调用以报告进度的函数。hub.client.reportProgress=function(functionName,progress){$('#progression').append(''+progress+':'+functionName+'');};//开始连接$.connection.hub.start().done(function(){$('#startlongprocess').click(function(){//启动长进程hub.server.start("arg");alert("started");});});});用于进度和启动的html容器按钮:如果您需要更多解释,请不要犹豫。(我的示例基于信号员团队http://www.asp.net/signalr/overview/getting-started/tutorial-getting-started-with-signalr)Youcanusewebsocketstopushprogressupdatestotheclient.SignalR是一个dotnet库,它包装websockets并回落到websockets没有的地方。如何用SignalR实现进度报告,网上有很全面的例子,就不再赘述了。看看这里:https://github.com/dragouf/SignalR.Progress或这里:https://www.safaribooksonline.com/blog/2014/02/06/server-side-signalr/一些例子。这是一个我认为可以解决您的问题的简化问题。如果您在任务中运行长时间操作,您可以使用状态对象更新您的应用程序。如果您的应用程序是WPF,并且您绑定了状态,它会自动更新。在WinForms中,您可以绑定或只实现事件处理程序。以上就是C#学习教程的全部内容:如何在服务器长进程中显示信息丰富的实时进度数据共享。如果对大家有用,需要详细了解C#学习教程,希望大家多多关注---voidMain(){varstatus=newStatus();对象储物柜=新对象();status.PropertyChanged+=Status_PropertyChanged;////任务中长时间运行的作业//vartask=newTask((s)=>{for(inti=0;i(refTfield,Tvalue,[CallerMemberName]stringpropertyName=null){if(EqualityComparer.Default.Equals(field,value))returnfalse;OnPropertyChanging(propertyName);field=value;OnPropertyChanged(propertyName);returntrue;}}本文收集自网络,不代表立场,如有雷同涉及侵权,请点击维权联系管理员删除,如需转载请注明出处:
