閱讀目錄
一:同步調用
二:非同步調用
三:同步調用WebService
四:非同步調用WebService
一:同步調用
一個同步操作會阻塞整個當前的進程,直到這個操作完成才能執行下一段代碼

10050T109-0  

二:非同步調用
不會阻塞啟動操作的調用執行緒,調用程式必須通過輪流檢測,或者等待完成信號來發現調用的完成

10050V610-1  

三:同步調用WebService
同步調用WebService就是我們平常的調用的寫法
1:AsynCall.asmx的AsynCall.cs代碼
/// <summary>
/// 根據學生姓名得到該學生的成績
/// </summary>
/// <param name="strName">學生姓名</param>
/// <param name="intDelaySecond">延遲的秒數</param>
/// <returns>成績</returns>
[WebMethod]
public int GetGrade(string strName, int intDelaySecond)
{
if (intDelaySecond > 0)
{
Thread.Sleep(intDelaySecond * 1000);
}
int intGrade = 0;
switch (strName)
{
case "張三":
intGrade = 90;
break;
case "李四":
intGrade = 80;
break;
case "王五":
intGrade = 70;
break;
case "賈六":
intGrade = 60;
break;
}
return intGrade;
}
2:Program.cs
AsynCall.AsynCall service = new AsynCall.AsynCall();
Console.WriteLine("請輸入要查詢成績的學生的姓名:");
string strName = Console.ReadLine();
Console.WriteLine("請輸入要延遲的秒數:");
int intSecond = int.Parse(Console.ReadLine());
#region 同步調用開始
Console.WriteLine("同步調用開始");
Console.WriteLine("同步調用結果為:" + service.GetGrade(strName, intSecond));
Console.WriteLine("同步調用結束");
Console.ReadLine();
#endregion
我們輸入30秒看看運行效果

10050TS0-2  

因為我們輸入的是30秒,所以我們要等到30秒後才能輸出「同步調用結果為:90」和「同步調用結束」這句話

10050QV1-3  

四:非同步調用WebService
. .NET Framework為非同步化的程式設計模型提供了必要的服務
. 決定特定的調用是否應該非同步處理是由用戶端也就是調用者決定,我們看到WebService本身並沒有發生變化,發生變化的是用戶端,是調用端
. 不需要進行額外的程式設計
. 代理類提供了WebService的方法名+Async()作為非同步調用WebService的方法名
. 非同步調用的實質是調用者執行緒和被調用者執行緒並存執行的過程
#region 非同步調用
Console.WriteLine("非同步調用開始");
//'+='表示事件的預定,'new AsynCall.GetGradeCompletedEventHandler(service_Completed)'表示利用編寫的事件處理常式生成一個委託實例,'service.GetGradeCompleted'表示添加什麼到產生事件物件的事件清單當中去,合起來解釋就是把這個委託實例添加到產生事件物件的事件清單當中去,這個過程叫做訂閱事件,委託就是代理,我們可以這樣理解,委託就是把一個事件處理函數和一個事件關聯起來
service.GetGradeCompleted += new AsynCall.GetGradeCompletedEventHandler(service_Completed);
//開始非同步調用
service.GetGradeAsync(strName, intSecond);
Console.WriteLine("當前進程沒有被阻塞");
for (int i = 0; i < 3; i++)
{
Console.WriteLine(i);
}
Console.ReadLine();
#endregion
private static void service_Completed(object sender, AsynCall.GetGradeCompletedEventArgs e)
{
Console.WriteLine("非同步調用結果為:" + e.Result);
Console.WriteLine("非同步調用結束");
}
我們同樣輸入30秒看看運行效果

10050U443-4  

因為我們輸入的還是30秒,所以我們要等到30秒後才能輸出「非同步調用結果為:90」這句話,這是誰也改變不了的,但是和同步調用不同之處在于,「當前進程沒有被阻塞」和for迴圈立即就輸出了,所以證明你在延遲30秒的時候,我繼續執行我下面的代碼,你延遲你的我不管,我不等你,等你到猴年馬月了,我繼續做我的事情
10050R401-5  
 
arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()