C#異步調(diào)用示例詳解
本文實(shí)例為大家分享了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ù), //以獲取開(kāi)始異步 BeginInvoke的調(diào)用結(jié)果 void BackCall(IAsyncResult parameter) { //parameter.IsCompleted用于判斷異步方法是否已調(diào)用完成; if(parameter.IsCompleted) { //通過(guò)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)用時(shí),先將 SendEmailAsync的參數(shù)傳入,BackCall是回調(diào)方法,s在此處的作用未弄明白, //但參數(shù)中不可省略 // 異步是相對(duì)于委托實(shí)例所在線程的,本示例中是指sendMail與sc.MailServiceClient不是一個(gè)線程; 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, "測(cè)試郵件", "測(cè)試郵件"); Console.Write("上面是異步開(kāi)始調(diào)用"); Console.Read(); } } }
另:以下是Invoke與BeginInvoke的區(qū)別。
Control.Invoke 方法 (Delegate) :在擁有此控件的基礎(chǔ)窗口句柄的線程上執(zhí)行指定的委托。
Control.BeginInvoke 方法 (Delegate) :在創(chuàng)建控件的基礎(chǔ)句柄所在線程上異步執(zhí)行指定委托。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- c# Invoke和BeginInvoke 區(qū)別分析
- C#中Invoke 和 BeginInvoke 的真正涵義
- C#線程 BeginInvoke和EndInvoke使用方法
- 基于使用BeginInvoke,EndInvoke異步調(diào)用委托的實(shí)現(xiàn)代碼
- C#中一個(gè)高性能異步socket封裝庫(kù)的實(shí)現(xiàn)思路分享
- C#實(shí)現(xiàn)異步編程的方法
- C#多線程與異步的區(qū)別詳解
- 淺談C#中的委托、事件與異步
- c#中Winform實(shí)現(xiàn)多線程異步更新UI(進(jìn)度及狀態(tài)信息)
- C#用委托BeginInvoke做異步線程
相關(guān)文章
C# 設(shè)計(jì)模式系列教程-狀態(tài)模式
狀態(tài)模式主要解決的是當(dāng)控制一個(gè)對(duì)象狀態(tài)轉(zhuǎn)換的條件表達(dá)式過(guò)于復(fù)雜時(shí)的情況。把狀態(tài)的判斷邏輯轉(zhuǎn)移到表示不同的一系列類當(dāng)中,可以把復(fù)雜的邏輯判斷簡(jiǎn)單化。2016-06-06Winform消除button按下出現(xiàn)的虛線簡(jiǎn)單實(shí)現(xiàn)方法
這篇文章主要介紹了Winform消除button按下出現(xiàn)的虛線簡(jiǎn)單實(shí)現(xiàn)方法,通過(guò)重寫button設(shè)置Selectable參數(shù)實(shí)現(xiàn)該功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08C#操作SQLite實(shí)現(xiàn)數(shù)據(jù)的增刪改查
SQLite是一個(gè)輕量級(jí)、跨平臺(tái)的關(guān)系型數(shù)據(jù)庫(kù),在小型項(xiàng)目中,方便,易用,同時(shí)支持多種開(kāi)發(fā)語(yǔ)言。本文將用C#語(yǔ)言對(duì)SQLite 的一個(gè)封裝,實(shí)現(xiàn)數(shù)據(jù)的增刪改查。需要的可以參考一下2022-01-01C#實(shí)現(xiàn)子窗體與父窗體通信方法實(shí)例總結(jié)
這篇文章主要介紹了C#實(shí)現(xiàn)子窗體與父窗體通信方法,實(shí)例總結(jié)了常用的四種窗體通信方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09C#實(shí)現(xiàn)將類的內(nèi)容寫成JSON格式字符串的方法
這篇文章主要介紹了C#實(shí)現(xiàn)將類的內(nèi)容寫成JSON格式字符串的方法,涉及C#針對(duì)json格式數(shù)據(jù)轉(zhuǎn)換的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08C#中使用1.7版本驅(qū)動(dòng)操作MongoDB簡(jiǎn)單例子
這篇文章主要介紹了C#中使用1.7版本驅(qū)動(dòng)操作MongoDB簡(jiǎn)單例子,本文給出了連接MongoDB、操作MongoDB數(shù)據(jù)等例子,需要的朋友可以參考下2015-01-01