最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解析C#中委托的同步調用與異步調用(實例詳解)

 更新時間:2013年05月18日 11:59:56   作者:  
本篇文章是對C#中委托的同步調用與異步調用進行了詳細的分析介紹,需要的朋友參考下
委托的Invoke方法用來進行同步調用。同步調用也可以叫阻塞調用,它將阻塞當前線程,然后執(zhí)行調用,調用完畢后再繼續(xù)向下進行。
同步調用的例子:
復制代碼 代碼如下:

using System;
using System.Threading;
public delegate int AddHandler(int a, int b);
public class Foo {
 static void Main() {
  Console.WriteLine("**********SyncInvokeTest**************");
  AddHandler handler = new AddHandler(Add);
  int result = handler.Invoke(1,2);
  Console.WriteLine("Do other work... ... ...");
  Console.WriteLine(result);
  Console.ReadLine();
 }

 static int Add(int a, int b) {
  Console.WriteLine("Computing "+a+" + "+b+" ...");
  Thread.Sleep(3000);
  Console.WriteLine("Computing Complete.");
  return a+b;
 }
}運行結果:
**********SyncInvokeTest**************
Computing 1 + 2 ...
Computing Complete.
Do other work... ... ...

同步調用會阻塞線程,如果是要調用一項繁重的工作(如大量IO操作),可能會讓程序停頓很長時間,造成糟糕
的用戶體驗,這時候異步調用就很有必要了。
異步調用不阻塞線程,而是把調用塞到線程池中,程序主線程或UI線程可以繼續(xù)執(zhí)行。
委托的異步調用通過BeginInvoke和EndInvoke來實現(xiàn)。
異步調用:
復制代碼 代碼如下:

using System;
using System.Threading;
public delegate int AddHandler(int a, int b);
public class Foo {
 static void Main() {
  Console.WriteLine("**********AsyncInvokeTest**************");
  AddHandler handler = new AddHandler(Add);
  IAsyncResult result = handler.BeginInvoke(1,2,null,null);
  Console.WriteLine("Do other work... ... ...");
  Console.WriteLine(handler.EndInvoke(result));
  Console.ReadLine();
 }

 static int Add(int a, int b) {
  Console.WriteLine("Computing "+a+" + "+b+" ...");
  Thread.Sleep(3000);
  Console.WriteLine("Computing Complete.");
  return a+b;
 }
}運行結果: **********AsyncInvokeTest**************
Do other work... ... ...
Computing 1 + 2 ...
Computing Complete.

可以看到,主線程并沒有等待,而是直接向下運行了。
但是問題依然存在,當主線程運行到EndInvoke時,如果這時調用沒有結束(這種情況很可能出現(xiàn)),這時為了等待調用結果,線程依舊會被阻塞。
解決的辦法是用回調函數(shù),當調用結束時會自動調用回調函數(shù)
回調異步:
復制代碼 代碼如下:

public class Foo {
 static void Main() {
  Console.WriteLine("**********AsyncInvokeTest**************");
  AddHandler handler = new AddHandler(Add);
  IAsyncResult result = handler.BeginInvoke(1,2,new AsyncCallback(AddComplete),"AsycState:OK");
  Console.WriteLine("Do other work... ... ...");
  Console.ReadLine();
 }

 static int Add(int a, int b) {
  Console.WriteLine("Computing "+a+" + "+b+" ...");
  Thread.Sleep(3000);
  Console.WriteLine("Computing Complete.");
  return a+b;
 }

 static void AddComplete(IAsyncResult result) {
  AddHandler handler = (AddHandler)((AsyncResult)result).AsyncDelegate;
  Console.WriteLine(handler.EndInvoke(result));
  Console.WriteLine(result.AsyncState);
 }
}

相關文章

  • c#滾動字幕動畫窗體制作步驟

    c#滾動字幕動畫窗體制作步驟

    在本篇文章里小編給大家分享了c#滾動字幕動畫窗體制作步驟和相關代碼,需要的朋友們可以學習下。
    2019-02-02
  • C#實現(xiàn)關閉子窗口而不釋放子窗口對象的方法

    C#實現(xiàn)關閉子窗口而不釋放子窗口對象的方法

    下面小編就為大家?guī)硪黄狢#實現(xiàn)關閉子窗口而不釋放子窗口對象的方法 。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • Unity3D實現(xiàn)自動尋路

    Unity3D實現(xiàn)自動尋路

    這篇文章主要為大家詳細介紹了Unity3D實現(xiàn)自動尋路,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • 基于C#實現(xiàn)哈夫曼樹算法

    基于C#實現(xiàn)哈夫曼樹算法

    哈夫曼樹又稱最優(yōu)二叉樹,也就是帶權路徑最短的樹,對于哈夫曼樹,我想大家對它是非常的熟悉,使用下面我們就來學習一下如何通過C#實現(xiàn)哈夫曼樹算法吧
    2023-11-11
  • 基于C# wpf 實現(xiàn)Grid內控件拖動詳情

    基于C# wpf 實現(xiàn)Grid內控件拖動詳情

    這篇文章主要介紹了基于C# wpf 實現(xiàn)Grid內控件拖動,有一些業(yè)務場景中我們需要拖動控件,在Grid中就可以實現(xiàn)控件拖動,通過設置Margin屬性即可,下面文章我們來看看具體的實現(xiàn)內容
    2021-11-11
  • C#使用Windows Service的簡單教程(創(chuàng)建、安裝、卸載、調試)

    C#使用Windows Service的簡單教程(創(chuàng)建、安裝、卸載、調試)

    這篇文章主要為大家詳細介紹了C#創(chuàng)建、安裝、卸載、調試Windows Service(Windows 服務)的簡單教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • C#實現(xiàn)對數(shù)組進行隨機排序類實例

    C#實現(xiàn)對數(shù)組進行隨機排序類實例

    這篇文章主要介紹了C#實現(xiàn)對數(shù)組進行隨機排序類,實例分析了C#數(shù)組與隨機數(shù)操作技巧,非常具有實用價值,需要的朋友可以參考下
    2015-03-03
  • c#日期間隔計算示例

    c#日期間隔計算示例

    這篇文章主要介紹了c#日期間隔計算類,最后有使用方法,需要的朋友可以參考下
    2014-02-02
  • C#組合函數(shù)的使用詳解

    C#組合函數(shù)的使用詳解

    本篇文章是對C#中的組合函數(shù)的使用進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • C#實現(xiàn)洗牌游戲實例

    C#實現(xiàn)洗牌游戲實例

    這篇文章主要介紹了C#實現(xiàn)洗牌游戲實例,對于數(shù)據(jù)結構與算法的學習有不錯的借鑒參考作用,需要的朋友可以參考下
    2014-08-08

最新評論

邳州市| 遵义县| 鄂托克旗| 平和县| 宜昌市| 衡水市| 镇雄县| 确山县| 门头沟区| 海盐县| 田东县| 行唐县| 法库县| 灵丘县| 静海县| 阿克| 页游| 微博| 千阳县| 报价| 迁安市| 云南省| 天水市| 津南区| 宣汉县| 阳东县| 运城市| 关岭| 方城县| 宁安市| 罗甸县| 湘乡市| 察哈| 上栗县| 尖扎县| 独山县| 手游| 如东县| 得荣县| 舟曲县| 大田县|