后台数据验证的时候前台实时显示进度?

walkeeper 2014-09-11 05:58:20
有块功能做的是异步上传文件,后台对导入的数据进行验证。经理要求能在后台验证的时候前台实时显示进度条,或者进度数字(比如FOR循环验证的时候把当前数字i和总数量一起显示在页面上 1/20,19/20类似的样子)。
本菜鸟研究了好几天,实在没啥头绪,这消息怎么回发到前台也搞不明白,同事说要新开个线程去显示进度,对于小白来说简直有如天书,度娘了一些多线程的教程也丝毫没有头绪,也不明白怎么才能在前台接到……
AJAX啊就只会按JQUERY的写法使用,再加上个线程直接歇菜了,回调函数里该怎么处理也不懂…………
求大大们给点建议或者发些已有的例子!水了那么多天的帖,终于有分可以派上用场了。求大大们帮忙啊啊!否则周末就要加两天班了…………
...全文
463 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
walkeeper 2014-09-15
  • 打赏
  • 举报
回复
引用 19 楼 save4me 的回复:
参考: COMET Streaming in Internet Explorer 因为这个MIS系统只能使用IE,那么是否可以确保用户能够升级到IE8(这个版本也可以支持Win XP)或以上?如果可以,那么应该可以实现你的需求,你可以点击上面文章里面提供的一个演示页面中的第二个按钮"Try XDR with prelude",看看是否可以看到1-10的进度。具体的js代码,可以在浏览器里面查看网页的源码。 注意因为IE浏览器和某些版本的Chrome的浏览器的原因,浏览器在收到2KB数据之前不会给出下载提示,所以服务器可以在相应中先发送2KB的空格。 [quote=引用 7 楼 walkeeper 的回复:] [quote=引用 5 楼 save4me 的回复:] 参考: 让ajax更加友好,实时显示后台处理进度。
还真不行= =!因为要给销售人员和柜台人员用的,他们的电脑都是不连外网的,连奇葩IE6都有的!
walkeeper 2014-09-15
  • 打赏
  • 举报
回复
引用 23 楼 jun471537173 的回复:
两个变量用session或viewstate来存取
SESSION我 也试过,依然没出来的样子= =!后来我用了APPLICATION或者静态变量才出来…… 现在是只会显示输出一次的数字 1/5 然后数字就不变了……
walkeeper 2014-09-15
  • 打赏
  • 举报
回复
引用 22 楼 sp1234 的回复:
[quote=引用 12 楼 walkeeper 的回复:] 再发下后台的和页面截图……
你的后台程序还 Response 输出? 搞复杂了,太技术化了,你其实被技术给玩儿“坏”了。 简单傻瓜的方法(后台程序根本不需要 Response 任何信息),首先能够达到目的。然后有空闲时间时再去重构。[/quote] 多谢SP大大指点!不甚感激!新人小白表示现在就懂点皮毛,太容易迷茫……
jun471537173 2014-09-15
  • 打赏
  • 举报
回复
引用 12 楼 walkeeper 的回复:
再发下后台的和页面截图……
 private int cur;
        private int total;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            { 
                if (Request.QueryString["Down"] == "C")
                {
                    ThreadTest();
                }
                if (Request.QueryString["Down"] == "T")
                {
                    ResponseProgress();
                }
            }
        }

        private void ThreadTest()
        {
            for (int i = 0; i < 5; i++)
            {
                this.cur = i+1;
                this.total = 5;
                Thread.Sleep(1000);
            }
            Response.Write("Complete!" + this.cur + "/" + this.total);
            Response.End();
        }

        private void ResponseProgress()
        {
            Response.Buffer = true;
            Response.Write(this.cur + "/" + this.total);
            Response.Flush();
            Response.End();
        }
两个变量用session或viewstate来存取
  • 打赏
  • 举报
回复
引用 12 楼 walkeeper 的回复:
再发下后台的和页面截图……
你的后台程序还 Response 输出? 搞复杂了,太技术化了,你其实被技术给玩儿“坏”了。 简单傻瓜的方法(后台程序根本不需要 Response 任何信息),首先能够达到目的。然后有空闲时间时再去重构。
  • 打赏
  • 举报
回复
如果你画出一个前后台通讯时序设计图,其实大概也就是: 1. 前端通知后台开启一个“数据验证任务”,然后立刻获取一个id号。 2. 前端然后定时轮询这个id号的任务的进度条,显示出来。 就这么简单。 (貌似)更好的方案当然是存在的!但是,如果技术上不有足够把握,如果根本不稳定可靠,如果没有经过大规模的测试,再时髦也不能在实际产品中采用。
  • 打赏
  • 举报
回复
引用 楼主 walkeeper 的回复:
有块功能做的是异步上传文件,后台对导入的数据进行验证。经理要求能在后台验证的时候前台实时显示进度条,或者进度数字(比如FOR循环验证的时候把当前数字i和总数量一起显示在页面上 1/20,19/20类似的样子)。 本菜鸟研究了好几天,实在没啥头绪,这消息怎么回发到前台也搞不明白,同事说要新开个线程去显示进度,对于小白来说简直有如天书,度娘了一些多线程的教程也丝毫没有头绪,也不明白怎么才能在前台接到…… AJAX啊就只会按JQUERY的写法使用,再加上个线程直接歇菜了,回调函数里该怎么处理也不懂………… 求大大们给点建议或者发些已有的例子!水了那么多天的帖,终于有分可以派上用场了。求大大们帮忙啊啊!否则周末就要加两天班了…………
我想大多数人都喜欢拿“数据库表”来理解内容通讯,那么我们就拿数据库表来理解。比如说你可以创建一个数据库表:进度条(id,总长度,当前长度)。这其实就完毕了!然后你的ajax去把这个信息读取出来显示,而已。 ajax只能单向轮询,这是所有(现在的)网页程序的硬伤。 各种新奇的什么“连接”,还没有达到靠谱的程度。不然也就不用花了好几年还有那么一大帮人到处在忽悠什么“html5、websocket”等等名词儿了,如果它不是因为技术上可靠性低早就应该普及了。所以你也不用过多跟风去折腾这些代码,那类代码对于你来说只能说是“学习”,根本不实用。 而从你的“后台”架构设计来看,进行所谓的“数据验证”如果是长时间的任务,那么你应该设计一个通用的“进度条”系统。这就是把进度条记录在上述数据库中表中,等待各种前端系统来查询。 不要纠结在一起,想什么复杂的思路。
save4me 2014-09-13
  • 打赏
  • 举报
回复
参考: COMET Streaming in Internet Explorer 因为这个MIS系统只能使用IE,那么是否可以确保用户能够升级到IE8(这个版本也可以支持Win XP)或以上?如果可以,那么应该可以实现你的需求,你可以点击上面文章里面提供的一个演示页面中的第二个按钮"Try XDR with prelude",看看是否可以看到1-10的进度。具体的js代码,可以在浏览器里面查看网页的源码。 注意因为IE浏览器和某些版本的Chrome的浏览器的原因,浏览器在收到2KB数据之前不会给出下载提示,所以服务器可以在相应中先发送2KB的空格。
引用 7 楼 walkeeper 的回复:
[quote=引用 5 楼 save4me 的回复:] 参考: 让ajax更加友好,实时显示后台处理进度。
看到标题就激动了一下,看到前面的话就更激动了简直就是我心中所想的资料。 结果后面来句IE不能用,瞬间心都碎了……这MIS系统只能用IE…………[/quote]
jun471537173 2014-09-12
  • 打赏
  • 举报
回复
百度下jquery 进度条就有很多例子啦,然后每次加的值用ajax从后台取
walkeeper 2014-09-12
  • 打赏
  • 举报
回复
可怜的新人完全没有人鸟啊啊啊啊啊!求大大们HELP啊= =!
walkeeper 2014-09-12
  • 打赏
  • 举报
回复
求助啊各位大大们!!!求HELP!!别沉了!!
walkeeper 2014-09-12
  • 打赏
  • 举报
回复
好的感谢!我回去研究一下……周末好好折腾折腾……虽然菜鸟最希望的还是能当个伸手党= =!否则周末就加班了= =………………
轮回归来 2014-09-12
  • 打赏
  • 举报
回复
http://www.cnblogs.com/miniwiki/archive/2010/06/18/1760540.html在博客园看到的关于多线程的文章,讲的很详细,希望对你有帮助
walkeeper 2014-09-12
  • 打赏
  • 举报
回复
引用 15 楼 u010070496 的回复:
弹出的数据时没有错误的,至于页面上显示一直是0/0,看上去像是线程不同步的问题,并且你好像并没有用到多线程,只是将当前线程暂停了一秒执行,所以你的两个请求并不是在同时发生的,页面上自动的请求一直是0/0,而点击的则是5/5(多次循环后的结果,虽然期间有暂停但是并没有在暂停的时候去做其他的事情,并且在第一次打开网页时点击会延迟几秒弹出也是这个原因),个人观点,其实我也是菜鸟
小白表示对多线程有心无力,压根儿不明白应该怎么实现……
轮回归来 2014-09-12
  • 打赏
  • 举报
回复
弹出的数据时没有错误的,至于页面上显示一直是0/0,看上去像是线程不同步的问题,并且你好像并没有用到多线程,只是将当前线程暂停了一秒执行,所以你的两个请求并不是在同时发生的,页面上自动的请求一直是0/0,而点击的则是5/5(多次循环后的结果,虽然期间有暂停但是并没有在暂停的时候去做其他的事情,并且在第一次打开网页时点击会延迟几秒弹出也是这个原因),个人观点,其实我也是菜鸟
sy401042879 2014-09-12
  • 打赏
  • 举报
回复
用.net的ajax控件应该好些。 .net ajax里面有个timer控件,用这个控件实时的更新你的进度条,视乎能简单些。
walkeeper 2014-09-12
  • 打赏
  • 举报
回复
显示的结果让我很郁闷,小白的个人感觉,是不是按钮的AJAX事件和定时的AJAX事件是不同的请求,所以服务器那里是分别处理的,全局变量都不能共通的= =?对网络方面的知识也是各种一知半解,说的有问题请大大们不要嘲笑…… 我想明白其中涉及到的原理,为啥这个代码不能按预期的结果工作,应该如何解决,而不单单是用控件解决……(控件的代码也看不懂 T_T)
walkeeper 2014-09-12
  • 打赏
  • 举报
回复
再发下后台的和页面截图……
 private int cur;
private int total;

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (Request.QueryString["Down"] == "C")
{
ThreadTest();
}
if (Request.QueryString["Down"] == "T")
{
ResponseProgress();
}
}
}

private void ThreadTest()
{
for (int i = 0; i < 5; i++)
{
this.cur = i+1;
this.total = 5;
Thread.Sleep(1000);
}
Response.Write("Complete!" + this.cur + "/" + this.total);
Response.End();
}

private void ResponseProgress()
{
Response.Buffer = true;
Response.Write(this.cur + "/" + this.total);
Response.Flush();
Response.End();
}

walkeeper 2014-09-12
  • 打赏
  • 举报
回复
我把测试代码发上来吧,烦请大大们分析一下…… JS里的(原谅小白连怎么JQ里写自定义函数都不知道……)
var xmlHttp;   
    if (window.ActiveXObject) {
        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    else {
        xmlHttp = new XMLHTTPRequest();
    }   

    function createRequest()//向服务器发出请求也就是向Default.aspx页面发出请求;
    {
        xmlHttp.onreadystatechange = DoResponse; //DoResponse是个回调函数
        xmlHttp.open("GET", "AjaxDownload.aspx?Down=T", true);
        xmlHttp.send(null);
    }

    function DoResponse()//服务器Default.aspx响应本页面并从服务器带回xmlHttp.responseText;
    {
        if (xmlHttp.readystate == 4 && xmlHttp.status == 200) {
            document.getElementById("ResponseText").innerHTML = xmlHttp.responseText;
        }        
    }

    
    function clock() {
        createRequest();
    }

    $(function() { 
        var clearflag; 
        $("#btn2").click(function() {
            clearflag = self.setInterval("clock()", 500);
            $.ajax({
                type: "Get",
                url: "AjaxDownload.aspx",
                dataType: "text",
                data: "Down=C",
                success: function(data) {
                    window.clearInterval(clearflag);
                    alert(data);
                }
            });
        }); //btn2 click end

    });            //jq end
HTML的
 <input type="button" id="btn2" value="AjaxThread" />
加载更多回复(7)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧