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方法获取异步方法的返回结果(类型与异步方法的结果一致) Task message=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):在创建控件的基础句柄所在线程上异步执行指定委托。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。