C#異步調(diào)用示例詳解
本文實例為大家分享了C#異步調(diào)用的具體代碼,供大家參考,具體內(nèi)容如下
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
namespace AsyncAppTest
{
  ////異步調(diào)用示例詳解  
  /// 第1步:定義委托;此委托的返回值、參數(shù)類型必須與要調(diào)用的異步方法一致;
  ///
  public delegate Task<string> AsyncSendMail(string rece, string copyer, string subj, string body);
  
  class DelegateTest
  {
    //定義委托變量
    AsyncSendMail sendMail = null; 
    
    //異步方法的回調(diào)方法
    //回調(diào)方法必須要有類型為 IAsyncResult的參數(shù),
    //以獲取開始異步 BeginInvoke的調(diào)用結(jié)果
    void BackCall(IAsyncResult parameter)
    { 
      //parameter.IsCompleted用于判斷異步方法是否已調(diào)用完成;
      if(parameter.IsCompleted)
      {  
        //通過EndInvoke方法獲取異步方法的返回結(jié)果(類型與異步方法的結(jié)果一致)      
        Task<string> message = sendMail.EndInvoke(parameter);
        Console.Write(string.Format("回調(diào)完成,返回值:{0}", message.Result));
      }
      else
      {
        Console.Write("調(diào)用未完成");
      }
    }
    public string AsyncSendMailHandler( string rece, string copyer, string sub, string body)
    { 
      //WcfTest.MailServiceClient 是服務(wù)器上的Wcf服務(wù),是本示例內(nèi)要調(diào)用的異步方法
      WcfTest.MailServiceClient sc = new WcfTest.MailServiceClient();
      
      //將異步方法與委托關(guān)聯(lián)
      sendMail = new AsyncSendMail(sc.SendEmailAsync); 
      string s = null;
      //以下BeginInvoke方法在調(diào)用時,先將 SendEmailAsync的參數(shù)傳入,BackCall是回調(diào)方法,s在此處的作用未弄明白,
      //但參數(shù)中不可省略
      // 異步是相對于委托實例所在線程的,本示例中是指sendMail與sc.MailServiceClient不是一個線程;
      sendMail.BeginInvoke(rece, copyer, sub, body, BackCall, s);      
      return s;
    }
    }
    
  class Program
  {    
    static void Main(string[] args)
    {      
      DelegateTest test = new DelegateTest();
      test.EventCompleteHandle("gqpeng@cmhit.com", null, "測試郵件", "測試郵件");
      Console.Write("上面是異步開始調(diào)用");
      Console.Read(); 
    }
  } 
}
另:以下是Invoke與BeginInvoke的區(qū)別。
Control.Invoke 方法 (Delegate) :在擁有此控件的基礎(chǔ)窗口句柄的線程上執(zhí)行指定的委托。
Control.BeginInvoke 方法 (Delegate) :在創(chuàng)建控件的基礎(chǔ)句柄所在線程上異步執(zhí)行指定委托。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
欄 目:C#教程
下一篇:C#計算2個字符串的相似度
本文標(biāo)題:C#異步調(diào)用示例詳解
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/5693.html
您可能感興趣的文章
- 01-10C#調(diào)用dos窗口獲取相關(guān)信息的方法
 - 01-10C#異步綁定數(shù)據(jù)實現(xiàn)方法
 - 01-10同步調(diào)用和異步調(diào)用WebService
 - 01-10C#調(diào)用WebService實例開發(fā)
 - 01-10C++調(diào)用C#的DLL程序?qū)崿F(xiàn)方法
 - 01-10C#異步下載文件
 - 01-10C# 調(diào)用 JavaWebservice服務(wù)遇到的問題匯總
 - 01-10Python設(shè)計模式編程中的備忘錄模式與對象池模式示例
 - 01-10使用C#發(fā)送帶附件的電子郵件的方法的代碼示例分析
 - 01-10在C#使用字典存儲事件示例及實現(xiàn)自定義事件訪問器
 


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
 - 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
 - 01-10WinForm限制窗體不能移到屏幕外的方法
 - 01-10WinForm繪制圓角的方法
 - 01-10C#實現(xiàn)txt定位指定行完整實例
 - 01-10WinForm實現(xiàn)仿視頻播放器左下角滾動新
 - 01-10C#停止線程的方法
 - 01-10C#實現(xiàn)清空回收站的方法
 - 01-10C#通過重寫Panel改變邊框顏色與寬度的
 - 01-10C#實現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
 
隨機(jī)閱讀
- 01-10C#中split用法實例總結(jié)
 - 01-10delphi制作wav文件的方法
 - 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
 - 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
 - 08-05DEDE織夢data目錄下的sessions文件夾有什
 - 01-10使用C語言求解撲克牌的順子及n個骰子
 - 01-11ajax實現(xiàn)頁面的局部加載
 - 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
 - 04-02jquery與jsp,用jquery
 - 08-05織夢dedecms什么時候用欄目交叉功能?
 


