通過異步調用機制,可以提高程序的運行效率,同時,給用戶良好的界面體驗。
.net2.0下提供了很好的機制來支持Web服務的異步調用。
下面通過一個例子來說明Web服務下怎樣實現異步調用。
首先先建立一個Web服務項目
{
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.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時,異步調用完成)
Console.WriteLine("開始調用遠程Web服務");
//開始異步調用遠程服務
MyServiceObj.BeginHelloWorld(new AsyncCallback(MyHelloWord), MyServiceObj);
這裏首先實例化Web服務,然後通過代理類myservice,來異步調用方法HelloWorld,AsyncCallback是一個委託,當異步調用完成時,它會自動調用MyHelloWrod方法。
我們通過MyHelloWrod方法,來調用EndHelloWrold方法,然後調用完成,設置MyStatus的狀態爲true,當計時器再次檢測MyStatus時,爲true,則異步調用完成。
{
MyService.MyService MyServices = (MyService.MyService)iar.AsyncState;
Console.WriteLine(MyServices.EndHelloWorld(iar));
//結束遠程調用
Program.MyStatus = true;
}