利用web workers實現多線程處理


 利用web workers在后台線程中實現對數據庫的增刪改查操作,並在后台線程中生成頁面上某個列表的完整的HTML代碼,然后再前台腳本中直接將這段HTML代碼輸出到頁面上!

    利用web workers可以實現無刷新的更新界面,而且還可以多線程處理其它功能,不必等到后台服務器代碼執行完后才能在頁面上執行下一步操作。有人會問AJAX也可以實現無刷新更新頁面,但是如果在后台服務器端執行代碼耗時較長,頁面就會停止在不能操作的狀態,如果拖過頁面,可能會造成頁面假死的狀態。

   利用web workers API創建后台線程:

   1.將后台執行的腳本文件的URL地址作為worker的參數,在后台線程中不能訪問頁面或窗口對象。如果在后台程序中包含window或是document對象,就會引發錯誤。

     var worker=new worker("worker.js");

   2.在后台線程中接收消息,利用worker對象的onmessage事件句柄獲取消息;

    

 worker.onmessage=function(event)
    {

      //處理收到的消息

    }

 

  3.利用worker對象的postmessage方法想后台線程發送消息;發送消息是文本數據,也可以是任何的JavaScript對象(需要通過JSON對象的stringify方法將其轉換成文本數據)

       worker.postMessage(message);

   下面講述一個實例,更好的闡述web workers的實現過程:

     1.前端頁面上的JavaScript腳本 

    

function windowOnLoad()
      {
         var worker=new worker("bgwork.js");//其中bgwork.js為后台線程運行的腳本文件
         worker.postMessage("load");//post為發送消息的文本數據 或是 data=new object(); worker.postMessage(JSON.stringify(data));//post為發送消息的文本數據
         worker.onmessage=function(event)
         {
           if(event.data=="數據庫連接發生錯誤!"||event.data=="讀取數據失敗!")
           {
             alert(event.data);
           } 
           else
           {
              //處理返回回來的數據
           }
        }
    }

 

   2.在后台線程中運行的JavaScript腳本

     

 onmessage=function(event){

        if(event.data=="load")

         { 

             var xhr=new XMLHtttpRequest();

             xhr.open("post","ceshi.aspx?type=load");//ceshi.aspx該頁面為新建頁面,專門處理前端數據傳過來后向數據庫的增刪改查功能;

            xhr.onreadystatechange=

           function(){

               var result=xhr.responseText;

               if(xhr.readyState==4)

              {

                      if(result=="數據庫連接發生錯誤!"||event.data=="讀取數據失敗!")

                             postMessage(result);

                     else

                       {

                         string str="";//處理經過服務端處理過的數據,然后返回前端

                          postMessage(str);

                        }

               }

          }

            xhr.send(null);

         }

    }

 

    3.在ceshi.aspx頁面處理數據

      

protected void Page_Load(object sender,EventArgs)
  {
    string type=Request.QueryString["type"].ToString();
    if(type.Equals("load"))
    {
      
      string result="";
      using(MemoryStream stream=new MemoryStream())
      { 
      //處理數據
       ArrayList dataArray=new ArrayList=new ArrayList();
       SerializeArray.WriteObject(stream,dataArray);
       result=Encoding.UTF8.GetString(stream.ToArray());
       this.WirteReturnStr(result);
      }
      
    }
  }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM