帝国CMS模板大全
www.admin99.cn
www.92cms.cn 帝国CMS模板下载站!,情怀,养站,二次开发!源码需求比较大的一站式会员下载,价更省!!!

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) :在创建控件的基础句柄所在线程上异步执行指定委托。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

dy(“nrwz”);

赞(0)
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《C#异步调用示例详解》
文章链接:https://www.admin99.cn/7762
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
QQ站长交流群:953950264

登录

找回密码

注册