通常我們做飯有一定的事件統籌管理,比如說我們不會等飯完全煮好了,再開始炒菜,因為這本是兩個獨立的互不干涉的事情。我們一般是燒水,然後去炒菜,如果水燒開了,我們再下米。 在這個過程中燒水和下米有先後關系,而他們和炒菜沒有直接關系。所以我們把燒水和下米包裝到一個方法中, 炒菜一個方法, 代碼如下。
Cooking.cs
*******************************************
namespace AsyncDelegate
{
class Cooking
{
public void StartCooking()
{
this.BoilingWater();
this.AddRice();
}
private void BoilingWater()
{
Console.WriteLine("開始燒水......");
System.Threading.Thread.Sleep(10000);//睡眠10秒表示燒水過程
Console.WriteLine("水開了......");
}
privatevoid AddRice()
{
Console.WriteLine("開始下米......");
System.Threading.Thread.Sleep(10000);//睡眠10秒表示煮飯過程
Console.WriteLine("飯煮好了......");
}
}
}
在炒菜類中我們只包含一個炒菜方法,代碼如下
Frying.cs
***********************************
namespace AsyncDelegate
{
class Frying
{
public void Fry
{
Console.WriteLine("開始炒菜......");
System.Threading.Thread.Sleep(10000);//睡眠10秒表示炒菜過程
Console.WriteLine("炒菜好了......");
}
}
}
現在是人這個類,這個類中用到了異步調用,代碼如下
Person.cs
***********************************
namespace AsyncDelegate
{
//因為我們要用於異步傳輸的兩個方法StartCooking 和Frying都是無參數
//返回值為空的,所以我們定義的委托也是這個形式的
public delegate void AsyncDel();
class Person
{
private Cooking cooking;
private Frying frying;
public Person()
{
cooking = new Cooking();
frying = new Frying();
}
public void StartWork()
{
AsyncDel ad1 = new AsyncDel(cooking.StartCooking);
IAsyncResult ar1 = ad1.BeginInvoke(new AsyncCallback(this.CallbackMethod), ad);
AsyncDel ad2 = new AsyncDel(frying.Fry);
IAsyncResult ar2 = ad.BeginInvoke(null, null);
while(!ar1.IsCompleted);
while(!ar2.IsCompleted);
Console.WriteLine("開飯了.......");
}
public void CallbackMethod(IAsyncResult ar)
{
AsyncDel ad = (AsyncDel)ar.AsyncState;
ad.EndInvoke(ar);
}
}
}
如果在Person類中的StartWork方法中沒有那兩個While,會有什麼情況發生?試試看!
這是我第一次寫技術性的文章,表述的比較粗糙,還有待加強,望多多指教。