熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> ASP編程 >> 正文

C#委托的同步調用和異步調用

2013-11-15 12:53:06  來源: ASP編程 

  對於C#委托我們談的比較多在此談論的是C#委托中的同步調用和異步調用希望本文的實例能給大家平時的工作有所幫助

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

  同步調用的例子

  using System;

  using SystemThreading;

  public delegate int AddHandler(int a int b);

  public class Foo

  {

  static void Main()

  {

  ConsoleWriteLine(**********SyncInvokeTest**************);

  AddHandler handler = new AddHandler(Add);

  int result = handlerInvoke();

  ConsoleWriteLine(Do other work );

  ConsoleWriteLine(result);    ConsoleReadLine();

  }

  static int Add(int a int b)

  {    ConsoleWriteLine(Computing +a+ + +b+ );

  ThreadSleep();

  ConsoleWriteLine(Computing Complete);

  return a+b;

  }

  }

  運行結果

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

  異步調用

  using System;

  using SystemThreading;

  public delegate int AddHandler(int a int b);

  public class Foo

  {

  static void Main()

  {

  ConsoleWriteLine(**********AsyncInvokeTest**************);

  AddHandler handler = new AddHandler(Add);

  IAsyncResult result = handlerBeginInvoke(nullnull);

  ConsoleWriteLine(Do other work );

  ConsoleWriteLine(handlerEndInvoke(result));

  ConsoleReadLine();

  }

  static int Add(int a int b)

  {

  ConsoleWriteLine(Computing +a+ + +b+ );

  ThreadSleep();

  ConsoleWriteLine(Computing Complete);

  return a+b;

  }

  }

  運行結果

  **********AsyncInvokeTest**************  Do other work   Computing +   Computing Complete 

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

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

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

  回調異步

  public class Foo

  {

  static void Main() {

  ConsoleWriteLine(**********AsyncInvokeTest**************);

  AddHandler handler = new AddHandler(Add);

  IAsyncResult result = handlerBeginInvoke(new AsyncCallback(AddComplete)AsycState:OK);

  ConsoleWriteLine(Do other work );    ConsoleReadLine();

  }

  static int Add(int a int b)

  {

  ConsoleWriteLine(Computing +a+ + +b+ );

  ThreadSleep();

  ConsoleWriteLine(Computing Complete);

  return a+b;

  }

  static void AddComplete(IAsyncResult result)

  {

  AddHandler handler = (AddHandler)((AsyncResult)result)AsyncDelegate;

  ConsoleWriteLine(handlerEndInvoke(result));

  ConsoleWriteLine(resultAsyncState);

  }

  }


From:http://tw.wingwit.com/Article/program/ASP/201311/21819.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.