2013-11-10 3 views
0

У меня есть приложение с длительной обработкой кода. Я думал о запуске долго время обработки путем вызова из яваскрипта страницы,индикатор выполнения с использованием нескольких вызовов ajax для asp.net

function OnCopy(type){ 
    var xmlhttp; 
    if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlhttp = new XMLHttpRequest(); 
    } 
    else {// code for IE6, IE5 
     xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    xmlhttp.onreadystatechange=function(){ 
     if (xmlhttp.readyState==4 && xmlhttp.status==200){ 
     //window.clearInterval(interval_handler); 
     alert('done'); 
     } 
    } 
    xmlhttp.open("GET", "<%=Request.Path %>?copy=" + type, true); 
    xmlhttp.send(); 
    interval_handler = window.setInterval(OnCheckStatus, 1000); 
} 

Последняя строка этой функции будет запустить таймер, чтобы проверить каждый второй статус:

function OnCheckStatus(){ 
    var xmlhttp; 
    if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlhttp = new XMLHttpRequest(); 
    } 
    else {// code for IE6, IE5 
     xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    xmlhttp.onreadystatechange=function(){ 
     if (xmlhttp.readyState==4 && xmlhttp.status==200){ 
      //window.clearInterval(interval_handler); 
      //var result = eval(xmlhttp.responseText); 
      //var pb = document.getElementById('progressbar_' + result[0]); 
      //if(pb != null) 
      // pb.innerHTML = result[1] + ' % - ' + result[2]; 
      debug++; 
      var pb = document.getElementById('progressbar_test'); 
      pb.innerHTML = debug; 
     } 
    } 

    xmlhttp.open("GET", "<%=Request.Path %>?checkstatus=1", true); 
    xmlhttp.send(); 
} 

На код позади меня эта длинная функция обработки времени и проверить функцию состояния:

private void Copy(string type) 
    { 
     Application["ProgressBar.Type"] = type; 

     for (int i = 0; i < 100; i++) 
     { 
      System.Threading.Thread.Sleep(100); 
      Application["ProgressBar.Value"] = i.ToString(); 
     } 

     Application["ProgressBar.Type"] = null; 
     Application["ProgressBar.Value"] = null; 
    } 

    private void CheckStatus() 
    { 
     Response.Clear(); 

     string type = (string)Application["ProgressBar.Type"]; 
     string value = (string)Application["ProgressBar.Value"]; 

     if (type == null) type = ""; 
     if (value == null) value = ""; 

     string response = "['" + type + "','" + value + "','" + DateTime.Now.ToString("HH:mm:ss") + "']"; 
     Response.Write(response); 
     Response.End(); 
    } 

Теперь, проблема в том, что до тех пор, функции копирования не закончена, нет ответа на функцию CheckStatus из кода позади (я думаю, что все вызовы поставлены в очередь), но когда это будет завершено, отображаемое значение отладки начнется с 10, прямо, как и все ответы для этих 10 звонков идут одинаково время. Как ASP.NET реагирует только на один вызов только за раз, из браузера. У меня создалось впечатление, что сервер будет обрабатывать как минимум 2 вызова одновременно из одного и того же браузера.

Помогите мне с этим, пожалуйста?

ответ

0

Пожалуйста, проверьте this article. Я думаю, что это поможет вам в решении вашей проблемы. Но также есть интегрированное решение в веб-формах asp.net под названием UpdateProgress msdn link with example

+0

Я пробовал использовать потоки, но у меня были ошибки доступа к безопасности, так как мой код (а не фиктивная часть, которую я написал) пытается скопировать некоторые файлы и установить права безопасности. Работа из потока страниц работает, но не из другого потока. - – user2976982

Смежные вопросы