C#異步調用示例詳解。本站提示廣大學習愛好者:(C#異步調用示例詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C#異步調用示例詳解正文
作者:千年海巖
這篇文章主要為大家詳細介紹了C#異步調用的示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下本文實例為大家分享了C#異步調用的具體代碼,供大家參考,具體內容如下
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
namespace AsyncAppTest
{
////異步調用示例詳解
/// 第1步:定義委托;此委托的返回值、參數類型必須與要調用的異步方法一致;
///
public delegate Task<string> AsyncSendMail(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<string> 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();
//將異步方法與委托關聯
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的區別。
Control.Invoke 方法 (Delegate) :在擁有此控件的基礎窗口句柄的線程上執行指定的委托。
Control.BeginInvoke 方法 (Delegate) :在創建控件的基礎句柄所在線程上異步執行指定委托。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持。