C#非同步編程的實現方式(1)——非同步委託

來源:互聯網
上載者:User

非同步實現即多線程,一種簡單的方式就是建立一個委託,然後非同步呼叫它。 .Net Framework已經為我們提供了委託的非同步呼叫方法。下面介紹三種使用委託實現非同步方法。

 

1、投票(IsCompleted屬性)

首先定義一個委託:

   1: public delegate string MyDelegate(int ms);

Delegate類提供了BeginInvoke()方法,這個方法返回一個IAsyncResult介面,這個介面包含了該委託的相關資訊,並且可以通過它的IsCompleted屬性來判斷該委託是否執行完成。下面是將要非同步呼叫的方法:

   1: static string DelegateMethod(int ms)
   2: {
   3:     Console.WriteLine("TakesAWhile started");
   4:     Thread.Sleep(ms);
   5:     Console.WriteLine("TakesAWhile completed");
   6:     return "Hello world!";
   7: }

下面是主線程的方法:

   1: static void Imp1()
   2: {
   3:     MyDelegate dl = DelegateMethod;
   4:  
   5:     IAsyncResult ar = dl.BeginInvoke(5000, null, null);
   6:  
   7:     while (!ar.IsCompleted)
   8:     {
   9:         Console.Write(".");
  10:         Thread.Sleep(50);
  11:     }
  12:     string result = dl.EndInvoke(ar);
  13:     Console.WriteLine("result: {0}", result);
  14: }

可以看到,委託線程執行5秒鐘,主線程不停的迴圈判斷委託線程是否完成(用IsCompleted屬性判斷)。如果沒完成則斷續打點,如果完成則跳出迴圈。用EndInvoke方法擷取委託的傳回值。如果方法未執行完,EndInvoke方法就會一直阻塞,直到被調用的方法執行完畢。

 

2、等待控制代碼(AsyncWaitHandle屬性)

使用IAsyncResult的AsyncWaitHandle屬性可以訪問等待控制代碼,這個屬性返回一個WaitHandle對象,這個對象的WaitOne()方法可輸入一個逾時時間作為參數,設定等待的最長時間。如果逾時,WaitOne()方法返回一個bool值,true為等待成功(即委託完成),非同步呼叫的方法與上面一樣,下面是主線程實現:

   1: static void Imp2()
   2: {
   3:     MyDelegate dl = DelegateMethod;
   4:  
   5:     IAsyncResult ar = dl.BeginInvoke(5000, null, null);
   6:     while (true)
   7:     {
   8:         Console.Write(".");
   9:         if (ar.AsyncWaitHandle.WaitOne(50))
  10:         {
  11:             Console.WriteLine("Can get the result now");
  12:             break;
  13:         }
  14:     }
  15:     string result = dl.EndInvoke(ar);
  16:     Console.WriteLine("result: {0}", result);
  17: }
主線程每等待50秒做一次判斷是否完成。  3、非同步回調(AsyncCallBack委託)BeginInvoke方法第二個參數可傳入一個AsnycCallBack委託類型的方法,當非同步呼叫完成時會執行這個方法。我們可以用Lambda運算式來實現:
   1: static void Imp3()
   2: {
   3:     MyDelegate dl = DelegateMethod;
   4:     dl.BeginInvoke(5000, new AsyncCallback(ar =>
   5:     {
   6:         string result = dl.EndInvoke(ar);
   7:         Console.WriteLine("result: {0}", result);
   8:     }), null);
   9:     for (int i = 0; i < 100; i++)
  10:     {
  11:         Console.Write(".");
  12:         Thread.Sleep(50);
  13:     }
  14: }
BeginInvoke方法的最後一個參數可以用IAsyncResult的AsyncState屬性擷取。 參考資料:《C#進階編程》

 

 

http://www.cnblogs.com/sosowjb/archive/2012/08/10/2631161.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.