如何在冗长的循环中使用服务器端变量更新客户端?我试图在一个冗长的服务器端进程之上放置一个Web界面,该进程应该在进程运行时向客户端发送定期的进度统计报告。我怎样才能做到这一点?到目前为止,这是我尝试过的。只要循环正在处理,web方法中的会话就是空的。当循环完成后再次按下开始按钮时,它可以获取会话值并填充标签。如何在进程运行时将此更新发送给客户端?我正在使用VS2012和ASP.NET4.5。编辑:更具体地说,问题发生在服务器忙于循环时。如果我取消循环并只是尝试定期从服务器中拉取变量值,那么就没有问题。将该变量放入一个循环中并尝试定期获取它,您将看到问题所在,如果您运行它,我发布的代码应该会澄清问题。谢谢。Default.aspx的函数GetCount(){$.ajax({type:"POST",url:"Default.aspx/GetCount",contentType:"application/json;charset=utf-8",data:{},dataType:“json”,成功:函数(数据){lblCount.innerHTML=data.d;},错误:函数(结果){警报(result.status+''+result.statusText);}});setTimeout(GetCount,5000);Default.aspx.cs使用系统;使用System.Collections.Generic;使用System.Linq;使用System.Web;使用System.Web.Services;使用System.Web.UI;使用System.Web.UI.WebControls;namespaceClientProgressTest{publicpartialclassDefault:System.Web.UI.Page{protectedvoidPage_Load(objectsender,EventArgse){}[WebMethod(EnableSession=true)]publicstaticstringGetCount(){stringcount=null;如果(HttpContext.Current.Session["count"]!=null){count=HttpContext.Current.Session["count"].ToString();}返回计数;}protectedvoidbtnGetCount_Click(objectsender,EventArgse){Sessi在[“计数”]=空;对于(inti=0;i<10000000;i++){Session["count"]=i;我在这里对这个问题做了一个冗长的回答:howUpdatingstatuslabelinajaxrequest为了让其他人找到相同的解决方案,我也将答案粘贴在这里:=======================================================================================这个例子使用JQueryforAJAX,代码隐藏在vb.net基本上你需要做的是让您的第一个电话启动长流程,然后重复第二个电话,使用第二种方法获取长流程的状态。AJAX这是您对长流程的主要要求。如有必要,您需要将数据传递给该方法。请注意,有一个processName。这应该是一个随机字符串,以确保您只获得此过程的状态。其他用户会有不同的随机进程名称,因此您不会感到困惑。JAVASCRIPTvarprocessName=functionGenerateProcessName(){varstr="";varalhpabet="abcdefghijklmnopqrstuvwxyz";for(i=1;i你的第二次AJAX调用将是获得进度的另一种方式。这将通过计时完成。计时器方法每XXX次调用一次。这就是TimerPoll函数;在这种情况下,它将每3秒触发一次JAVASCRIPTfunctionTimerPoll(){timer=setTimeout("GetProgress()",3000)}最后,GetProgress()函数可以获得进度。我们必须传入上面使用的相同processName以获取此用户调用的进程JAVASCRIPTfunctionGetProgress(){//进行ajax调用$j.ajax({type:"POST",url:"/MyWebService.asmx/MyMainWorkerProgress",data:"{'processName':'"+processName+"'}",contentType:"application/json;charset=utf-8",dataType:"json",success:function(msg){//Evaulateresult..varprocess=msg.dif(process.processComplete){//销毁计时器以停止轮询进度clearTimeout(timer);//在这里向用户发送最终消息。}else{//显示你必须给用户的消息。//这些将在msg.d.messages中//另一个行程的轮询计时器TimerPoll();}});现在,在后端,您将拥有几个与AJAX通信的Web方法。您还需要一个共享/静态对象来保存所有进度信息,以及您想要传递给用户的任何信息。就我而言,我创建了一个类,每次调用MyMainWorkerProcess时都会填充并传回属性。看起来有点像这样。VB.NET公共类ProcessData公共属性processCompleteAsBooleanPublicPropertymessagesAsList(OfString)=NewList(OfString)EndClass我还有一个使用此类的共享属性,它看起来像...(这个共享属性能够保存来自多个用户的多个进程-因此字典。字典的键将是进程名称。所有进度数据将在ProcessData类中PrivateSharedprocessProgressAsDictionary(OfString,ProcessData)=NewDictionary(OfString,ProcessData)我的mainworkerfunction看起来有点像这样注意我们首先保证没有其他processProgress有相同的VB.NET共享的所有内容,如果对你有用还需要详细了解C#学习教程,希望大家多多关注---_本文采集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除,如有请注明来源:
