今天就跟大家聊聊有關怎么在C#項目中實現異步調用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
具體內容如下
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using System.Threading.Tasks; namespace AsyncAppTest { ////異步調用示例詳解 /// 第1步:定義委托;此委托的返回值、參數類型必須與要調用的異步方法一致; /// public delegate TaskAsyncSendMail(string rece, string copyer, string subj, string body); class DelegateTest { //定義委托變量 AsyncSendMail sendMail = null; //異步方法的回調方法 //回調方法必須要有類型為 IAsyncResult的參數, //以獲取開始異步 BeginInvoke的調用結果 void BackCall(IAsyncResult parameter) { //parameter.IsCompleted用于判斷異步方法是否已調用完成; if(parameter.IsCompleted) { //通過EndInvoke方法獲取異步方法的返回結果(類型與異步方法的結果一致) Task message = sendMail.EndInvoke(parameter); Console.Write(string.Format("回調完成,返回值:{0}", message.Result)); } else { Console.Write("調用未完成"); } } public string AsyncSendMailHandler( string rece, string copyer, string sub, string body) { //WcfTest.MailServiceClient 是服務器上的Wcf服務,是本示例內要調用的異步方法 WcfTest.MailServiceClient sc = new WcfTest.MailServiceClient(); //將異步方法與委托關聯(lián) sendMail = new AsyncSendMail(sc.SendEmailAsync); string s = null; //以下BeginInvoke方法在調用時,先將 SendEmailAsync的參數傳入,BackCall是回調方法,s在此處的作用未弄明白, //但參數中不可省略 // 異步是相對于委托實例所在線程的,本示例中是指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("上面是異步開始調用"); Console.Read(); } } }
另:以下是Invoke與BeginInvoke的區(qū)別。
Control.Invoke 方法 (Delegate) :在擁有此控件的基礎窗口句柄的線程上執(zhí)行指定的委托。
Control.BeginInvoke 方法 (Delegate) :在創(chuàng)建控件的基礎句柄所在線程上異步執(zhí)行指定委托。
看完上述內容,你們對怎么在C#項目中實現異步調用有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注創(chuàng)新互聯(lián)網站建設公司行業(yè)資訊頻道,感謝大家的支持。
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。