91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

化州市| 开阳县| 合阳县| 锡林浩特市| 迭部县| 万载县| 兴化市| 扎鲁特旗| 宝坻区| 化州市| 五原县| 库伦旗| 南汇区| 寻乌县| 余江县| 漠河县| 托里县| 南宁市| 兴业县| 隆林| 上饶市| 甘洛县| 商洛市| 宜城市| 湖州市| 肥乡县| 八宿县| 马山县| 阜南县| 万州区| 沙湾县| 炎陵县| 鄯善县| 盐边县| 田阳县| 本溪市| 武山县| 贺州市| 清徐县| 兴安县| 南雄市|