C#异步调用示例详解
本文实例为大家分享了C#异步调用的具体代码,供大家参考,具体内容如下
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Runtime.InteropServices;
usingSystem.Threading.Tasks;
namespaceAsyncAppTest
{
////异步调用示例详解
///第1步:定义委托;此委托的返回值、参数类型必须与要调用的异步方法一致;
///
publicdelegateTaskAsyncSendMail(stringrece,stringcopyer,stringsubj,stringbody);
classDelegateTest
{
//定义委托变量
AsyncSendMailsendMail=null;
//异步方法的回调方法
//回调方法必须要有类型为IAsyncResult的参数,
//以获取开始异步BeginInvoke的调用结果
voidBackCall(IAsyncResultparameter)
{
//parameter.IsCompleted用于判断异步方法是否已调用完成;
if(parameter.IsCompleted)
{
//通过EndInvoke方法获取异步方法的返回结果(类型与异步方法的结果一致)
Taskmessage=sendMail.EndInvoke(parameter);
Console.Write(string.Format("回调完成,返回值:{0}",message.Result));
}
else
{
Console.Write("调用未完成");
}
}
publicstringAsyncSendMailHandler(stringrece,stringcopyer,stringsub,stringbody)
{
//WcfTest.MailServiceClient是服务器上的Wcf服务,是本示例内要调用的异步方法
WcfTest.MailServiceClientsc=newWcfTest.MailServiceClient();
//将异步方法与委托关联
sendMail=newAsyncSendMail(sc.SendEmailAsync);
strings=null;
//以下BeginInvoke方法在调用时,先将SendEmailAsync的参数传入,BackCall是回调方法,s在此处的作用未弄明白,
//但参数中不可省略
//异步是相对于委托实例所在线程的,本示例中是指sendMail与sc.MailServiceClient不是一个线程;
sendMail.BeginInvoke(rece,copyer,sub,body,BackCall,s);
returns;
}
}
classProgram
{
staticvoidMain(string[]args)
{
DelegateTesttest=newDelegateTest();
test.EventCompleteHandle("gqpeng@cmhit.com",null,"测试邮件","测试邮件");
Console.Write("上面是异步开始调用");
Console.Read();
}
}
}
另:以下是Invoke与BeginInvoke的区别。
Control.Invoke方法(Delegate):在拥有此控件的基础窗口句柄的线程上执行指定的委托。
Control.BeginInvoke方法(Delegate):在创建控件的基础句柄所在线程上异步执行指定委托。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。