通過定義委托,來實現同步和異步,委托通過Action和Func來實現,記錄學習委托的同步和異步的過程
委托的同步方法
委托的Invoke方法用來進行同步調用。
static void Main(string[] args)
{
//無參數方法
Action action = () => Console.WriteLine("action方法執行");
action.Invoke();
//有一個參數(多個參數基本相同)
Action<string> action2 = (t) => Console.WriteLine("action方法執行,{0}", t);
action2.Invoke("我在測試");
//帶一個參數帶返回值
Func<int, bool> func = (t) => {
int i = new Random().Next(1, 10);
Console.WriteLine("隨機數是{0}", i);
return i > t;
};
bool b = func.Invoke(5);
Console.WriteLine("{0}",b);
Console.Read();
}
同步調用會阻塞線程,如果是要調用一項繁重的工作(如大量IO操作),可能會讓程序停頓很長時間,造成糟糕的用戶體驗,這時候異步調用就很有必要了。
委托的異步調用
異步調用不阻塞線程,而是把調用塞到線程池中,程序主線程或UI線程可以繼續執行。委托的異步調用通過BeginInvoke和EndInvoke來實現。
static void Main(string[] args)
{
//無參數方法
Action action = () => Console.WriteLine("action方法執行");
action.BeginInvoke(null,null);
//有一個參數(多個參數基本相同)
Action<string> action2 = (t) => Console.WriteLine("action方法執行,{0}", t);
action2.BeginInvoke("我是個測試",null,null);
//帶一個參數帶返回值
Func<int, bool> func = (t) => {
int i = new Random().Next(1, 10);
Console.WriteLine("隨機數是{0}", i);
return i > t;
};
var result = func.BeginInvoke(5,null,null);
bool b = func.EndInvoke(result);
Console.WriteLine("{0}",b);
Console.Read();
}
異步回調
用回調函數,當調用結束時會自動調用回調函數,解決了為等待調用結果,而讓線程依舊被阻塞的局面。
static void Main(string[] args)
{
//無參數方法
Action action = () => Console.WriteLine("action方法執行");
AsyncCallback callback1 = t =>
{
Console.WriteLine("我是回調1");
};
action.BeginInvoke(callback1, null);
//有一個參數(多個參數基本相同)
Action<string> action2 = (t) => Console.WriteLine("action方法執行,{0}", t);
AsyncCallback callback2 = t =>
{
Console.WriteLine("我是回調2");
};
action2.BeginInvoke("我是個測試", callback2, null);
//帶一個參數帶返回值
Func<int, bool> func = (t) => {
int i = new Random().Next(1, 10);
Console.WriteLine("隨機數是{0}", i);
return i > t;
};
AsyncCallback callback3 = t =>
{
Console.WriteLine("我是回調3");
};
var result = func.BeginInvoke(5, callback3, null);
bool b = func.EndInvoke(result);
Console.WriteLine("{0}",b);
Console.Read();
}
