閱讀目錄
一:同步處理
二:非同步處理
三:非同步委託
四:通過委託同步調用方法
五:通過委託非同步呼叫方法
一:同步處理
一個同步操作會阻塞整個當前的進程,直到這個操作完成才能執行下一段代碼
二:非同步處理
不會阻塞啟動操作的調用線程,調用程式必須通過輪流檢測,或者等待完成訊號來發現調用的完成
三:非同步委託
. 非同步委託通過以非同步方式調用同步方法的能力,在《同步調用WebService和非同步呼叫WebService》一文中,裡面也講過了,同樣一個Web服務,只是因為調用的方式不同,就成了同步調用和非同步呼叫了,同步就是直接調用
. 當同步調用一個委託時,調用方法直接為當前線程的目標方法,這裡就是指GetNameFirst()方法,如果編譯器支援非同步委託,則它將產生BeginInvoke()方法和EndInvoke()方法
. 只要是任何函數在我們的編譯器中,除了直接調用之外,還有一個非同步呼叫,也就是BeginInvoke()和EndInvoke(),BeginInvoke()返回結果是判斷執行是否完成,EndInvoke()返回調用結果
四:通過委託同步調用方法
class User
{
//要調用的動態方法
public string GetNameFirst()
{
Thread.Sleep(30000);
return "從小就犯困";
}
//要調用的靜態方法
public static string GetNameSecond()
{
return "從小就犯困";
}
}
//委託聲明(函數簽名)
delegate string MyMethodDelegate();
static void Main(string[] args)
{
User user = new User();
//方式一:同步調用方法,聲明一個委託變數mydelegate,且綁定到動態方法GetNameFirst
MyMethodDelegate my_delegate = new MyMethodDelegate(user.GetNameFirst);
string strResult = my_delegate();
Console.WriteLine(strResult);
Console.ReadKey();
}
因為我們讓當前線程休眠的時間是30秒,所以我們要等到30秒後才能輸出“從小就犯困”
五:通過委託非同步呼叫方法
using System.Runtime.Remoting.Messaging;
delegate string MyMethodDelegate();
static void Main(string[] args)
{
//方式二:非同步呼叫方法,聲明一個委託變數mydelegate,且綁定到動態方法GetNameSecond
MyMethodDelegate my_delegate = new MyMethodDelegate(User.GetNameSecond);
AsyncResult async_result;//此類封閉非同步委託非同步呼叫的結果,通過AsyncResult得到結果
//開始調用
async_result = (AsyncResult)my_delegate.BeginInvoke(null, null);
//判斷線程是否執行完成
while (!async_result.IsCompleted)
{
Console.WriteLine("正在非同步執行方法GetNameSecond()......");
}
Console.WriteLine("方法GetNameSecond()執行完成");
//等待委託調用的方法的完成
string strResult = my_delegate.EndInvoke(async_result);
Console.WriteLine(strResult);
Console.ReadKey();
}