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ù),
//以獲取開始異步 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)用時(shí),先將 SendEmailAsync的參數(shù)傳入,BackCall是回調(diào)方法,s在此處的作用未弄明白,
//但參數(shù)中不可省略
// 異步是相對于委托實(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, "測試郵件", "測試郵件");
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# Invoke和BeginInvoke 區(qū)別分析
- C#中Invoke 和 BeginInvoke 的真正涵義
- C#線程 BeginInvoke和EndInvoke使用方法
- 基于使用BeginInvoke,EndInvoke異步調(diào)用委托的實(shí)現(xiàn)代碼
- C#中一個(gè)高性能異步socket封裝庫的實(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# Invoke和BeginInvoke 區(qū)別分析
這篇文章主要介紹了c# Invoke和BeginInvoke 區(qū)別分析,需要的朋友可以參考下2014-10-10
Unity基于ShaderLab實(shí)現(xiàn)光照系統(tǒng)(著色器代碼實(shí)現(xiàn)小結(jié))
這篇文章主要介紹了Unity基于ShaderLab實(shí)現(xiàn)光照系統(tǒng),主要總結(jié)unity中shaderlab的著色器代碼實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01
C#實(shí)現(xiàn)窗體抖動(dòng)的兩種方法
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)窗體抖動(dòng)的兩種方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11
Winform開發(fā)中使用下拉列表展示字典數(shù)據(jù)的幾種方式
這篇文章介紹了Winform開發(fā)中使用下拉列表展示字典數(shù)據(jù)的幾種方式,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09

