亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#中怎么實現同步調用和異步調用

發布時間:2021-07-08 15:37:10 來源:億速云 閱讀:150 作者:Leah 欄目:編程語言

今天就跟大家聊聊有關C#中怎么實現同步調用和異步調用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

C#委托的Invoke方法用來進行同步調用。同步調用也可以叫阻塞調用,它將阻塞當前線程,然后執行調用,調用完畢后再繼續向下進行。

同步調用的例子:

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... ... ...  3

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

異步調用:

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.  3


可以看到,主線程并沒有等待,而是直接向下運行了。

但是問題依然存在,當主線程運行到EndInvoke時,如果這時調用沒有結束(這種情況很可能出現),這時為了等待調用結果,線程依舊會被阻塞。

解決的辦法是用回調函數,當調用結束時會自動調用回調函數

回調異步:

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#中怎么實現同步調用和異步調用有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

吴桥县| 晋江市| 曲阳县| 华安县| 读书| 惠来县| 日喀则市| 丰台区| 台南县| 河曲县| 鱼台县| 马公市| 临猗县| 屏东县| 周至县| 县级市| 宜川县| 武平县| 石嘴山市| 玉林市| 修水县| 土默特右旗| 黎城县| 德惠市| 龙岩市| 始兴县| 富川| 广元市| 交城县| 株洲县| 惠东县| 津南区| 德安县| 宜良县| 镇巴县| 吴忠市| 高雄市| 黄陵县| 新丰县| 金寨县| 武胜县|