Web服務下的異步調用

通過異步調用機制,可以提高程序的運行效率,同時,給用戶良好的界面體驗。

.net2.0下提供了很好的機制來支持Web服務的異步調用。

下面通過一個例子來說明Web服務下怎樣實現異步調用。

首先先建立一個Web服務項目

public class MyService : System.Web.Services.WebService
{
    
public MyService () {

        
//Uncomment the following line if using designed components 
        
//InitializeComponent(); 
    }


    [WebMethod]
    
public string HelloWorld() {
        
return "Hello World";
    }

    
}
 

然後再建立一個控制檯程序

添加Web Reference,會在Web Reference下生成一個localhost的Web Reference.

然後能過wsdl/namespace:MyService http://localhost/異步調用/service.asmx?wsdl生成MyService代理類,然後添加到控制檯程序中。

 

using System;
using System.Collections.Generic;
using System.Text;
using MyService;

namespace AnsyDemo
{
    
class Program
    
{
        
static bool MyStatus = false;
        
static void Main(string[] args)
        
{
            System.Timers.Timer tr 
= new System.Timers.Timer();
            tr.Interval 
= 1000;
            tr.Enabled 
= true;
            tr.Elapsed 
+= new System.Timers.ElapsedEventHandler(OnTimeEven);
            
//localhost.MyService MySeriveObj = new AnsyDemo.localhost.MyService();

            
//Console.WriteLine("開始調用遠程Web服務");

            
//開始異步調用遠程服務

            MyService.MyService MyServiceObj 
= new MyService.MyService();
            Console.WriteLine(
"開始調用遠程Web服務");

            
//開始異步調用遠程服務
            MyServiceObj.BeginHelloWorld(new AsyncCallback(MyHelloWord), MyServiceObj);

            
//int i = 0;
            
//while (Program.MyStatus != true)
            
//{
            
//    i++;
            
//    Console.WriteLine("等待Web服務調用結束....#" + i.ToString());
            
//}
            
//Console.WriteLine("遠程調用結束");
            int j = 0;
            
for (int i = 1; i < 100; i++)
            
{
                j 
+= i;
            }

            Console.WriteLine(j.ToString());
            Console.ReadLine();
           
        }


        
static void MyHelloWord(IAsyncResult iar)
        
{
            MyService.MyService MyServices 
= (MyService.MyService)iar.AsyncState;
            Console.WriteLine(MyServices.EndHelloWorld(iar));
            
//結束遠程調用
            Program.MyStatus = true;
        }



        
private static void OnTimeEven(object source, System.Timers.ElapsedEventArgs e)
        
{
            
if (MyStatus == true)
            
{
                Console.WriteLine(
"調用結束");
            }


        }

    }

}

在這段程序中,定義了一個定時器,在一個固定的時間,來測試異步調用是否完成。(當MyStatus=true時,異步調用完成)

 

 MyService.MyService MyServiceObj = new MyService.MyService();
            Console.WriteLine(
"開始調用遠程Web服務");

            
//開始異步調用遠程服務
            MyServiceObj.BeginHelloWorld(new AsyncCallback(MyHelloWord), MyServiceObj);

 

 這裏首先實例化Web服務,然後通過代理類myservice,來異步調用方法HelloWorld,AsyncCallback是一個委託,當異步調用完成時,它會自動調用MyHelloWrod方法。

我們通過MyHelloWrod方法,來調用EndHelloWrold方法,然後調用完成,設置MyStatus的狀態爲true,當計時器再次檢測MyStatus時,爲true,則異步調用完成。

 

static void MyHelloWord(IAsyncResult iar)
        
{
            MyService.MyService MyServices 
= (MyService.MyService)iar.AsyncState;
            Console.WriteLine(MyServices.EndHelloWorld(iar));
            
//結束遠程調用
            Program.MyStatus = true;
        }

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章