詳解C#基礎之委託非同步
大家知道委託就相當於C++裡面的函式指標,相信大家都很很瞭解,看看如下簡單程式碼來回想一下委託
- public delegate void Ad(); xu xus = new xu();
- Ad b = new Ad(xus.Add);
- b += xus.ex;
- b();
- Console.ReadLine();
- class xu
- {
- public void Add()
- {
- //Thread.Sleep(5000);
- Console.WriteLine("sssssssssssssssssssss");
- }
- public void ex()
- {
- //Thread.Sleep(5000);
- Console.WriteLine("aaaaaaaaaaaaaaaaaaaaa");
- } }
這裡我們看見 定義了一個ADD 的委託沒有引數沒有返回值 然後把委託指向ADD 和ex 兩個方法(多播委託) 然後執行b() 執行之後 結果大家應該知道 就是執行了這2個方法列印出 "ssssssssssssss"於"aaaaaaaaaaaaaaaa"。那如果變成下面這個形式呢?
- public delegate int Ad(int x,int y);
- static void Main(string[] args)
- {
- xu xus = new xu();
- Ad a = new Ad(Add);
- a += (int x, int y) => { return x - y; };
- Console.WriteLine(a(3,2));
- Console.ReadLine();
- }
- static int Add(int x, int y)
- {
- //Thread.Sleep(2000);
- return x + y; }
- static int ex(int x, int y)
- {
- //Thread.Sleep(5000);
- return x - y;
- }
- }
這段程式碼 也是執行一個多播委託 但是輸出的結果會是什麼樣的呢 答案是 輸出1,為什麼前面那個委託會輸出2個方法 而這個委託只會輸出第二個方法的返回值?如果我們也想輸出2個返回值怎麼辦呢?其實很簡單 程式碼如下
- public delegate int Ad(int x,int y);
- static void Main(string[] args)
- {
- xu xus = new xu();
- Ad a = new Ad(Add);
- a += (int x, int y) => { return x - y; };
- Delegate[] d = a.GetInvocationList();
- for (int i = 0; i
- {
- if (d[i] is Ad)
- {
- Ad s = (Ad)d[i];
- Console.WriteLine(s(3, 2));
- }
- }
- Console.ReadLine();
- }
- static int Add(int x, int y)
- {
- // Thread.Sleep(2000);
- return x + y;
- }
- static int ex(int x, int y)
- {
- //Thread.Sleep(5000);
- return x - y;
- } }
這裡我們使用了一個GetInvocationList 方法來返回多播委託的呼叫列表 然後轉化ad 然後迴圈呼叫 最後顯示的結果就是5,1。委託的 複習我們就看到這裡 現在回到正題 看看委託的非同步呼叫。
- public delegate int Ad(int x,int y);
- static void Main(string[] args)
- {
- xu xus = new xu();
- Ad a = new Ad(Add);
- Console.WriteLine(a(3, 3));
- Console.WriteLine("start");
- Console.ReadLine();
- }static int Add(int x, int y)
- {
- Thread.Sleep(2000);
- return x + y;
- }
執行這段程式碼 會先停頓2秒鐘之後再顯示6 和start 因為我使用了sleep這個方法 它使該執行緒休眠2秒鐘,所以會在2秒之後顯示資訊,但是這對使用者體驗來說是非常糟糕的,那我們怎麼改善呢?看看如下程式碼
- public delegate int Ad(int x,int y);
- static void Main(string[] args)
- {
- xu xus = new xu();
- Ad a = new Ad(Add);
- Console.WriteLine(a(3, 3));
- // Console.WriteLine("start");
- IAsyncResult isa= a.BeginInvoke(3, 3, null, null);
- while (!isa.IsCompleted)
- {
- Console.WriteLine("未完成");
- }
- int s= a.EndInvoke(isa);
- Console.WriteLine(s.ToString());
- Console.ReadLine();
- }
- static int Add(int x, int y)
- {
- Thread.Sleep(2000);
- return x + y;
- }
- static int ex(int x, int y)
- {
- //Thread.Sleep(5000);
- return x - y;
- }
這裡我們使用了begininvoke方法來非同步執行 委託方法返回一個IAsyncResult 型別的值 代表委託執行的狀態,使用一個while迴圈 來判斷IsCompleted 如果沒有完成非同步呼叫則不斷顯示“未完成” 如果完成endinvoke 則返回結果。但是這裡需要不斷的詢問操作完成狀態 那麼我們怎樣讓委託非同步呼叫完成之後主動通知我們呢? 看看如下程式碼
- public delegate int Ad(int x,int y);
- static void Main(string[] args)
- {
- xu xus = new xu();
- Ad a = new Ad(Add);
- Console.WriteLine(a(3, 3));
- IAsyncResult isa= a.BeginInvoke(3, 3, new AsyncCallback(call), "edit by xyl");
- //執行你想執行的程式碼 這裡我們還是用IsCompleted來代替
- while (!isa.IsCompleted)
- {
- Console.WriteLine("未完成");
- }
- Console.ReadLine();
- }
- static void call(IAsyncResult isa)
- {
- AsyncResult ar = (AsyncResult)isa;
- Ad a = (Ad)ar.AsyncDelegate;
- Console.WriteLine("this is {0},{1}",a.EndInvoke(isa),ar.AsyncState);
- }
- static int Add(int x, int y)
- {
- Thread.Sleep(2000);
- return x + y;
- }
- static int ex(int x, int y)
- {
- //Thread.Sleep(5000);
- return x - y;
- } }
這裡我們使用了一個call方法 注意它是沒有返回值的。把IAsyncResult轉換成AsyncResult注意少了個I然後轉換成AD 型別的委託 最後endinvoke 來返回值 這樣在委託非同步執行完成之後會自動通知方法。呵呵 好了今天就說到這裡吧。如果有說的不對的地方歡迎指正 大家一起學習一起進步。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-682720/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C#基礎:泛型委託C#泛型
- C#基礎委託回顧C#
- C#委託使用詳解(Delegates)C#
- C# 委託(Delegates)使用詳解C#
- 詳解C#委託與事件C#事件
- 詳解C#委託和事件(一)C#事件
- 詳解C#委託和事件(二)C#事件
- 委託與事件-委託詳解(一)事件
- C#委託的非同步呼叫C#非同步
- Kotlin基礎 — 委託Kotlin
- C# 之委託與事件C#事件
- C#基礎系列:委託和設計模式(2)C#設計模式
- 詳解C#委託,事件與回撥函式C#事件函式
- JavaScript 事件委託詳解JavaScript事件
- C#委託C#
- C#自學(一)委託(delegate)、委託泛型、多播委託C#泛型
- C# 事件委託C#事件
- C#委託(delegate)C#
- C# 委託事件C#事件
- C#基礎系列:委託實現簡單設計模式(1)C#設計模式
- 事件委託詳解最新版事件
- 委託與事件-事件詳解(二)事件
- C#的委託案例C#
- C#委託與事件C#事件
- C#委託理解(1)C#
- c# 委託測試C#
- C#再識委託C#
- C# 事件 vs 委託C#事件
- C#中的委託C#
- C# - 委託與事件C#事件
- c# 委託和事件C#事件
- C# 委託(delegate)、泛型委託和Lambda表示式C#泛型
- C#程式設計之委託與事件(一)C#程式設計事件
- C#程式設計之委託與事件(二)C#程式設計事件
- 基礎拾遺---委託,匿名函式,lambda函式
- 瞭解下C# 委託(Delegate)C#
- 什麼是委託(C#)C#
- C#中的執行緒一(委託中的非同步)C#執行緒非同步