實現異步調用Web Service,防止頁面超時

普通調用Web Service的方法,在Web Service執行期間客戶端會一直等待服務執行完畢才能響應。從而形成客戶端UI線程的阻塞假死現象。這時候,異步調用就顯得頗有用,它可讓客戶端在調用Web Service時,不至於阻塞客戶端的UI線程致使假死,還能夠在調用Web Service的同時作些其餘的處理。異步調用Web Service也有幾種不一樣的方法,這裏介紹經常使用的兩種。 數據庫

     第一種方法,是經過利用Backgroundworker對象實現。 BackgroundWorker 類容許你在單獨的專用線程上運行操做。耗時的操做(以下載和數據庫事務)在長時間運行時可能會致使用戶界面(UI)彷佛處於中止響應狀態。若是你須要能進行響應的用戶界面,並且面臨與這類操做相關的長時間延遲,則可使用 BackgroundWorker 類方便地解決問題。 服務器

private void button1_Click(object sender, EventArgs e) 異步

{ ide

    BackgroundWorker backgroundworker = new BackgroundWorker(); 線程

    //註冊具體異步處理的方法 代理

    backgroundworker.DoWork += new DoWorkEventHandler(back_DoWork); 對象

    //註冊調用完成後的回調方法 事件

    backgroundworker.RunWorkerCompleted += 事務

        new RunWorkerCompletedEventHandler(back_RunWorkerCompleted); string

    //這裏開始異步調用

    backgroundworker.RunWorkerAsync();

    //調用服務的同時客戶端處理並不中止

    ChangeProcessBar();

}

//完成事件

void back_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

{

    if (e.Error != null)

        throw e.Error;

    progressBar1.Value = progressBar1.Maximum; //調用完成了,把客戶端進度條填充滿

    string price = e.Result.ToString();   //獲取處理結果

    MessageBox.Show("調用完成。價格是:" + price); //顯示從服務器獲取的結果值

}

//調用方法

void back_DoWork(object sender, DoWorkEventArgs e)

{

    //Web Service代理類

    ProductService.LTPService service = new ProductService.LTPService();

    //調用Web方法GetClass1,將結果賦值給DoWorkEventArgs的Result對象

    e.Result = service.GetProductPrice("001");

}

其中,ChangeProcessBar()方法是處理進度條控制顯示的代碼,用於表明其餘的操做。

//<summary>

//界面的進度條顯示

//</summary>

void ChangeProcessBar()

{

    for (int i = 0; i &lt; 10; i++)

    {

        progressBar1.Value = i;

        System.Threading.Thread.Sleep(500);

    }

}

 

      第二種方法,是調用Web Service的WebMethod中的Async方法實現。當添加完Web Service的引用之後,會在本地生成代理類,其中,會有一個和原Web Service方法名字相同然後綴是Async的方法。

 

private void button2_Click(object sender, EventArgs e)

{

    //Web Service代理類

    ProductService.LTPService service = new ProductService.LTPService();

    //這裏開始異步調用

    service.GetProductPriceAsync("001");

    //註冊調用完成後的回調方法

    service.GetProductPriceCompleted += new ProductService.

        GetProductPriceCompletedEventHandler(GetProductPriceCompleted);

    //調用同時客戶端處理不中止 

    ChangeProcessBar();

}

//完成事件處理方法

void GetProductPriceCompleted(object sender, ProductService.

             GetProductPriceCompletedEventArgs e)

{

    if (e.Error != null)

        throw e.Error;

    progressBar1.Value = progressBar1.Maximum; //調用完成了,把客戶端進度條填充滿

    string price = e.Result.ToString();         //獲取處理結果

    MessageBox.Show("調用完成。價格是:" + price); //顯示從服務器獲取的結果值

}

相關文章
相關標籤/搜索