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
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是回调方法,
//BackCall后的参数s是用于传递参数给回调方法BackCall,可在回调方法内用IAsyncResult.AsyncState获取,在本例中即 parameter.AsyncState
//但参数中不可省略
// 异步是相对于委托实例所在线程的,本示例中是指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) :在创建控件的基础句柄所在线程上异步执行指定委托。

最新文章

  1. win10系统下连接无线网络掉线问题解决办法
  2. 学习codeIgniter的一点小感受
  3. [java基础]java跨平台的基础知识
  4. 给jar包进行数字签名(2014-06-28记)
  5. Discuz! 6.x/7.x 全局变量防御绕过导致命令执行
  6. All X_数的快速幂
  7. UML 类图基础知识记录
  8. Windows xp 重载内核(使用Irp进行文件操作)
  9. 从零开始,在windows上用nodejs搭建一个静态文件服务器
  10. swift - use backslash to add the value in the string
  11. RSA加密算法验证(C#实现)
  12. Linux的ls命令在Windows中的应用
  13. php $_SERVER[&#39;HTTP_USER_AGENT&#39;] 用法介绍
  14. Python动态语言的特性
  15. java程序中的乱码方案
  16. sqlserver数据库设计完整性与约束
  17. KnockoutJs学习笔记(八)
  18. POJ 1007 DNA sorting (关于字符串和排序的水题)
  19. SVN、Git设置提交时忽略的文件
  20. task optimization之superglue分析

热门文章

  1. 【转载】 C++之split字符串分割
  2. python chrome的自定义启动
  3. H5取经之路——添加hover实现特定效果
  4. [C++]数据结构-排序:插入排序之直接插入排序
  5. C#多态及接口
  6. L1-Day2
  7. JAVA进阶8
  8. SpringBatch框架简介
  9. H - Partial Tree HDU - 5534 (背包)
  10. 设计模式五: 原型模式(Prototype)