程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 淺談委托和異步調用

淺談委托和異步調用

編輯:關於SqlServer
 最近在學委托和事件,看了一篇網上很有名的文章 -- 一個C#睡前故事,在裡面最後用到了異步調用,於是我找了一些資料,了解了一下異步調用。我想了一下,其實我們生活中的一些事情就很像異步調用的形式,比如我下面要說的例子, 做飯。

   通常我們做飯有一定的事件統籌管理,比如說我們不會等飯完全煮好了,再開始炒菜,因為這本是兩個獨立的互不干涉的事情。我們一般是燒水,然後去炒菜,如果水燒開了,我們再下米。 在這個過程中燒水和下米有先後關系,而他們和炒菜沒有直接關系。所以我們把燒水和下米包裝到一個方法中, 炒菜一個方法, 代碼如下。

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,會有什麼情況發生?試試看!

這是我第一次寫技術性的文章,表述的比較粗糙,還有待加強,望多多指教。

  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved