成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解C#基礎之委托異步

開發 后端
我們要談到的是C#基礎之委托異步,還有有別于C++里面的函數指針的。希望對大家有所幫助。

大家知道委托就相當于C++里面的函數指針,相信大家都很很了解,看看如下簡單代碼來回想一下委托

  1. public delegate void Ad(); xu xus = new xu();            
  2. Ad b = new Ad(xus.Add);              
  3. b += xus.ex;              
  4. b();              
  5. Console.ReadLine();  
  6. class xu     
  7.  {         
  8.  public void Add()       
  9.    {              
  10. //Thread.Sleep(5000);             
  11.  Console.WriteLine("sssssssssssssssssssss");         
  12.  }          
  13. public void ex()          
  14. {             
  15.  //Thread.Sleep(5000);             
  16.  Console.WriteLine("aaaaaaaaaaaaaaaaaaaaa");         
  17.  }    }  

這里我們看見 定義了一個ADD 的委托沒有參數沒有返回值 然后把委托指向ADD 和ex 兩個方法(多播委托) 然后執行b()  執行之后 結果大家應該知道 就是執行了這2個方法打印出 "ssssssssssssss"于"aaaaaaaaaaaaaaaa"。那如果變成下面這個形式呢?

  1. public delegate int Ad(int x,int y);          
  2. static void Main(string[] args)          
  3. {             
  4.  xu xus = new xu();              
  5. Ad a = new Ad(Add);              
  6. a += (int x, int y) => { return x - y; };            
  7. Console.WriteLine(a(3,2));              
  8. Console.ReadLine();          
  9. }          
  10. static int Add(int x, int y)          
  11. {              
  12. //Thread.Sleep(2000);              
  13. return x + y;        }          
  14. static int ex(int x, int y)         
  15.  {              
  16. //Thread.Sleep(5000);             
  17.  return x - y;         
  18.  }    
  19.   } 

這段代碼 也是執行一個多播委托 但是輸出的結果會是什么樣的呢 答案是 輸出1,為什么前面那個委托會輸出2個方法 而這個委托只會輸出第二個方法的返回值?如果我們也想輸出2個返回值怎么辦呢?其實很簡單 代碼如下

  1. public delegate int Ad(int x,int y);          
  2. static void Main(string[] args)         
  3.  {              
  4. xu xus = new xu();              
  5. Ad a = new Ad(Add);              
  6. a += (int x, int y) => { return x - y; };            
  7. Delegate[] d = a.GetInvocationList();              
  8. for (int i = 0; i < d.Length; i++)            
  9. {                  
  10. if (d[i] is Ad)                 
  11.  {                    
  12.  Ad s = (Ad)d[i];                      
  13. Console.WriteLine(s(3, 2));               
  14.    }        
  15.       }                
  16. Console.ReadLine();         
  17.  }          
  18. static int Add(int x, int y)        
  19.   {             
  20. // Thread.Sleep(2000);              
  21. return x + y;         
  22.  }          
  23. static int ex(int x, int y)         
  24.  {              
  25. //Thread.Sleep(5000);             
  26.  return x - y;       
  27.    }    } 

這里我們使用了一個GetInvocationList 方法來返回多播委托的調用列表 然后轉化ad 然后循環調用 最后顯示的結果就是5,1。委托的 復習我們就看到這里 現在回到正題 看看委托的異步調用。

  1. public delegate int Ad(int x,int y);          
  2. static void Main(string[] args)          
  3. {              
  4. xu xus = new xu();              
  5. Ad a = new Ad(Add);              
  6. Console.WriteLine(a(3, 3));              
  7. Console.WriteLine("start");             
  8.  Console.ReadLine();          
  9. }static int Add(int x, int y)         
  10.  {              
  11. Thread.Sleep(2000);              
  12. return x + y;      
  13.     } 

運行這段代碼 會先停頓2秒鐘之后再顯示6 和start 因為我使用了sleep這個方法 它使該線程休眠2秒鐘,所以會在2秒之后顯示信息,但是這對用戶體驗來說是非常糟糕的,那我們怎么改善呢?看看如下代碼

  1.  public delegate int Ad(int x,int y);          
  2. static void Main(string[] args)          
  3. {              
  4. xu xus = new xu();              
  5. Ad a = new Ad(Add);             
  6.  Console.WriteLine(a(3, 3));             
  7. // Console.WriteLine("start");             
  8. IAsyncResult isa= a.BeginInvoke(3, 3, nullnull);             
  9. while (!isa.IsCompleted)            
  10.  {              
  11.  Console.WriteLine("未完成");      
  12.        }            
  13. int s= a.EndInvoke(isa);            
  14. Console.WriteLine(s.ToString());             
  15. Console.ReadLine();          
  16. }           
  17. static int Add(int x, int y)         
  18.  {             
  19.  Thread.Sleep(2000);             
  20.  return x + y;         
  21.  }         
  22.  static int ex(int x, int y)          
  23. {              
  24. //Thread.Sleep(5000);             
  25.  return x - y;        
  26.   }  

這里我們使用了begininvoke方法來異步執行 委托方法返回一個IAsyncResult 類型的值 代表委托執行的狀態,使用一個while循環 來判斷IsCompleted 如果沒有完成異步調用則不斷顯示“未完成” 如果完成endinvoke 則返回結果。但是這里需要不斷的詢問操作完成狀態 那么我們怎樣讓委托異步調用完成之后主動通知我們呢? 看看如下代碼

  1.   public delegate int Ad(int x,int y);        
  2. static void Main(string[] args)       
  3.  {            
  4. xu xus = new xu();            
  5. Ad a = new Ad(Add);            
  6. Console.WriteLine(a(3, 3));            
  7. IAsyncResult isa= a.BeginInvoke(3, 3, new AsyncCallback(call), "edit by xyl");              
  8. //執行你想執行的代碼 這里我們還是用IsCompleted來代替          
  9.  while (!isa.IsCompleted)             
  10. {              
  11.  Console.WriteLine("未完成");          
  12.    }              
  13. Console.ReadLine();     
  14.      }          
  15. static void call(IAsyncResult isa)          
  16. {              
  17. AsyncResult ar = (AsyncResult)isa;             
  18.  Ad a = (Ad)ar.AsyncDelegate;            
  19. Console.WriteLine("this is {0},{1}",a.EndInvoke(isa),ar.AsyncState);         
  20.  }          
  21. static int Add(int x, int y)       
  22.    {              
  23. Thread.Sleep(2000);        
  24.       return x + y;         
  25.  }         
  26.  static int ex(int x, int y)         
  27.  {              
  28. //Thread.Sleep(5000);              
  29. return x - y;         
  30.  }    }  

這里我們使用了一個call方法 注意它是沒有返回值的。把IAsyncResult轉換成AsyncResult注意少了個I然后轉換成AD 類型的委托 最后endinvoke 來返回值 這樣在委托異步執行完成之后會自動通知方法。呵呵 好了今天就說到這里吧。如果有說的不對的地方歡迎指正 大家一起學習一起進步。

原文鏈接:http://www.cnblogs.com/xylasp/archive/2010/12/20/1911812.html

【編輯推薦】

  1. C#取整函數實例應用詳解
  2. C#單元測試的一個小故事
  3. C#單元測試概念及作用的淺析
  4. C#單元測試使用的必要性的淺析
  5. C#單元測試的運行淺析

 

責任編輯:彭凡 來源: 博客園
相關推薦

2011-04-22 09:14:26

C#委托

2009-08-20 18:37:52

委托C#異步委托

2009-09-08 15:28:24

C#委托

2009-08-21 11:24:16

C#異步調用

2023-09-26 07:38:53

c#Lambda表達式

2009-08-20 18:11:08

C#異步委托

2009-08-21 10:13:02

C#異步初步

2009-10-20 16:48:30

C#委托

2010-09-14 14:05:42

C#委托

2021-02-09 09:53:11

C#多線程異步

2009-08-20 16:33:44

Socket異步通訊

2009-08-18 10:35:26

C#委托

2024-12-23 08:00:00

委托C#編程

2009-09-01 18:36:35

C#委托實例

2024-09-18 00:00:02

反射C#元數據

2025-04-30 01:50:00

C#異步編程

2011-06-08 14:22:51

延遲加載

2011-07-06 10:14:46

C#

2009-08-27 16:53:01

C#委托C#事件

2024-05-16 13:36:04

C#委托事件
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩中文字幕av | 韩国av一区二区 | 噜噜噜噜狠狠狠7777视频 | 日本不卡一区二区三区在线观看 | 18成人在线观看 | 国产a一区二区 | 成人三级在线观看 | aⅴ色国产 欧美 | 日韩第一区| 日韩精品视频网 | 国产精品中文在线 | 99在线免费观看视频 | 欧美一区二区三区视频 | 国产激情视频在线观看 | 天天拍天天草 | 免费视频二区 | 精品一区二区三区免费视频 | 欧美中文在线 | 欧美 日韩 视频 | 99久久国产综合精品麻豆 | 欧美一级欧美一级在线播放 | 天天玩天天干天天操 | 一级aaaaaa毛片免费同男同女 | 欧美福利久久 | 久久午夜国产精品www忘忧草 | 狠狠撸在线视频 | 99精品视频免费观看 | 婷婷五月色综合 | 欧美激情精品久久久久久变态 | 国产高清视频 | 一区二区视频在线观看 | 99热精品6| 看a网站| 精品一二区 | 成人精品国产一区二区4080 | 九九九久久国产免费 | 免费国产网站 | 成人精品一区二区三区 | 久久久久久久网 | 美日韩免费 | 91精品国产99|