首页 > 编程 > C# > 正文

C#异步调用示例详解

2019-10-29 21:09:54
字体:
来源:转载
供稿:网友

本文实例为大家分享了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) :在创建控件的基础句柄所在线程上异步执行指定委托。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VEVB武林网。


注:相关教程知识阅读请移步到c#教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表