潤宇軟件
首 頁 企業簡介 項目案例 軟件定制 行業軟件 解決方案 下載中心 服務專區 客服中心
業務介紹:西安軟件公司、軟件開發、軟件定制、軟件外包
軟件 方案 文章
  潤宇軟件 >> 新聞資訊  >> 網絡版資訊

C#異步編程模式IAsyncResult概述

發布時間:2015/12/26  瀏覽次數:5次  字體【    】

30选5是每天开奖吗 www.hbadc.icu IAsyncResult 異步設計模式通過名為 BeginOperationName 和 EndOperationName 的兩個方法來實現原同步方法的異步調用,如 FileStream 類提供了 BeginRead 和 EndRead 方法來從文件異步讀取字節,它們是 Read 方法的異步版本

Begin 方法包含同步方法簽名中的任何參數,此外還包含另外兩個參數:一個AsyncCallback 委托和一個用戶定義的狀態對象。委托用來調用回調方法,狀態對象是用來向回調方法傳遞狀態信息。該方法返回一個實現 IAsyncResult 接口的對象

End 方法用于結束異步操作并返回結果,因此包含同步方法簽名中的 ref 和 out 參數,返回值類型也與同步方法相同。該方法還包括一個 IAsyncResult 參數,用于獲取異步操作是否完成的信息,當然在使用時就必須傳入對應的 Begin 方法返回的對象實例

開始異步操作后如果要阻止應用程序,可以直接調用 End 方法,這會阻止應用程序直到異步操作完成后再繼續執行。也可以使用 IAsyncResult 的 AsyncWaitHandle 屬性,調用其中的WaitOne等方法來阻塞線程。這兩種方法的區別不大,只是前者必須一直等待而后者可以設置等待超時

如果不阻止應用程序,則可以通過輪循 IAsyncResult 的 IsCompleted 狀態來判斷操作是否完成,或使用 AsyncCallback 委托來結束異步操作。AsyncCallback 委托包含一個 IAsyncResult 的簽名,回調方法內部再調用 End 方法來獲取操作執行結果

C#異步編程模式IAsyncResult之IAsyncResult 接口

  1. public interface IAsyncResult
  2. {
  3. object AsyncState { get; }
  4. WaitHandle AsyncWaitHandle { get; }
  5. bool CompletedSynchronously { get; }
  6. bool IsCompleted { get; }
  7. }

我用一個 AsyncDemo 類作為異步方法的提供者,后面的程序都會調用它。內部很簡單,構造函數接收一個字符串作為 name ,Run 方法輸出 "My name is " + name ,而異步方法直接用委托的 BeginInvoke 和 EndInvoke 方法實現

  1. public class AsyncDemo
  2. {
  3. // Use in asynchronous methods
  4. private delegate string runDelegate();
  5. private string m_Name;
  6. private runDelegate m_Delegate;
  7. public AsyncDemo(string name)
  8. {
  9. m_Name = name;
  10. m_Delegate = new runDelegate(Run);
  11. }
  12. /// ﹤summary﹥
  13. /// Synchronous method
  14. /// ﹤/summary﹥
  15. /// ﹤returns﹥﹤/returns﹥
  16. public string Run()
  17. {
  18. return "My name is " + m_Name;
  19. }
  20. /// ﹤summary﹥
  21. /// Asynchronous begin method
  22. /// ﹤/summary﹥
  23. /// ﹤param name="callBack"﹥﹤/param﹥
  24. /// ﹤param name="stateObject"﹥﹤/param﹥
  25. /// ﹤returns﹥﹤/returns﹥
  26. public IAsyncResult BeginRun(
  27. AsyncCallback callBack, Object stateObject)
  28. {
  29. try
  30. {
  31. return m_Delegate.BeginInvoke(callBack, stateObject);
  32. }
  33. catch(Exception e)
  34. {
  35. // Hide inside method invoking stack
  36. throw e;
  37. }
  38. }
  39. /// ﹤summary﹥
  40. /// Asynchronous end method
  41. /// ﹤/summary﹥
  42. /// ﹤param name="ar"﹥﹤/param﹥
  43. /// ﹤returns﹥﹤/returns﹥
  44. public string EndRun(IAsyncResult ar)
  45. {
  46. if (ar == null)
  47. throw new NullReferenceException(
  48. "Arggument ar can't be null");
  49. try
  50. {
  51. return m_Delegate.EndInvoke(ar);
  52. }
  53. catch (Exception e)
  54. {
  55. // Hide inside method invoking stack
  56. throw e;
  57. }
  58. }
  59. }

C#異步編程模式IAsyncResult操作步驟:首先是 Begin 之后直接調用 End 方法,當然中間也可以做其他的操作

  1. class AsyncTest
  2. {
  3. static void Main(string[] args)
  4. {
  5. AsyncDemo demo = new AsyncDemo("jiangnii");
  6. // Execute begin method
  7. IAsyncResult ar = demo.BeginRun(null, null);
  8. // You can do other things here
  9. // Use end method to block thread
  10. // until the operation is complete
  11. string demoName = demo.EndRun(ar);
  12. Console.WriteLine(demoName);
  13. }
  14. }

也可以用 IAsyncResult 的 AsyncWaitHandle 屬性,我在這里設置為1秒超時

  1. class AsyncTest
  2. {
  3. static void Main(string[] args)
  4. {
  5. AsyncDemo demo = new AsyncDemo("jiangnii");
  6. // Execute begin method
  7. IAsyncResult ar = demo.BeginRun(null, null);
  8. // You can do other things here
  9. // Use AsyncWaitHandle.WaitOne method to block thread for 1 second at most
  10. ar.AsyncWaitHandle.WaitOne(1000, false);
  11. if (ar.IsCompleted)
  12. {
  13. // Still need use end method to get result,
  14. // but this time it will return immediately
  15. string demoName = demo.EndRun(ar);
  16. Console.WriteLine(demoName);
  17. }
  18. else
  19. {
  20. Console.WriteLine("Sorry,
  21. can't get demoName, the time is over");
  22. }
  23. }
  24. }

C#異步編程模式IAsyncResult要注意的還有:不中斷的循環,每次循環輸出一個 "."

  1. class AsyncTest
  2. {
  3. static void Main(string[] args)
  4. {
  5. AsyncDemo demo = new AsyncDemo("jiangnii");
  6. // Execute begin method
  7. IAsyncResult ar = demo.BeginRun(null, null);
  8. Console.Write("Waiting..");
  9. while (!ar.IsCompleted)
  10. {
  11. Console.Write(".");
  12. // You can do other things here
  13. }
  14. Console.WriteLine();
  15. // Still need use end method to get result,
  16. //but this time it will return immediately
  17. string demoName = demo.EndRun(ar);
  18. Console.WriteLine(demoName);
  19. }
  20. }

最后是使用回調方法并加上狀態對象,狀態對象被作為 IAsyncResult 參數的 AsyncState 屬性被傳給回調方法?;氐鞣椒ㄖ蔥星安荒莧彌饗叱掏順?,我這里只是簡單的讓其休眠了1秒。另一個與之前不同的地方是 AsyncDemo 對象被定義成了類的靜態字段,以便回調方法使用

  1. class AsyncTest
  2. {
  3. static AsyncDemo demo = new AsyncDemo("jiangnii");
  4. static void Main(string[] args)
  5. {
  6. // State object
  7. bool state = false;
  8. // Execute begin method
  9. IAsyncResult ar = demo.BeginRun(
  10. new AsyncCallback(outPut), state);
  11. // You can do other thins here
  12. // Wait until callback finished
  13. System.Threading.Thread.Sleep(1000);
  14. }
  15. // Callback method
  16. static void outPut(IAsyncResult ar)
  17. {
  18. bool state = (bool)ar.AsyncState;
  19. string demoName = demo.EndRun(ar);
  20. if (state)
  21. {
  22. Console.WriteLine(demoName);
  23. }
  24. else
  25. {
  26. Console.WriteLine(demoName + ", isn't it?");
  27. }
  28. }
  29. }

C#異步編程模式IAsyncResult的后話:

對于一個已經實現了 BeginOperationName 和 EndOperationName方法的對象,我們可以直接用上述方式調用,但對于只有同步方法的對象,我們要對其進行異步調用也不需要增加對應的異步方法,而只需定義一個委托并使用其 BeginInvoke 和 EndInvoke 方法就可以了。

C#異步編程模式IAsyncResult的基本情況就向你介紹到這里,希望對你了解和學習C#異步編程模式IAsyncResult有所幫助。

  關閉本頁
西部IT網合作伙伴 合作伙伴
陜西省 | 榆林 | 延安 | 銅川 | 渭南 | 商洛 | 寶雞 | 漢中 | 安康 | 咸陽
網站首頁 | 關于我們 | 售后服務 | 項目合同 | 查看留言 | 在線留言 | 30选5是每天开奖吗
© 版權所有:西安潤宇軟件科技有限公司 
公司地址:西安市碑林區 聯系電話:029-87878512 手機:13468700578 聯系人:李先生
Copyright ® 2009-2015 RunYusoft.com Inc. All Rights Reserved 
技術支持:西安潤宇軟件科技有限公司  陜ICP備11000720號-3