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
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) :在创建控件的基础句柄所在线程上异步执行指定委托。
C#中异步调用示例与详解的更多相关文章
- python golang中grpc 使用示例代码详解
python 1.使用前准备,安装这三个库 pip install grpcio pip install protobuf pip install grpcio_tools 2.建立一个proto文件 ...
- [转载]C#异步调用四大方法详解
C#异步调用四大方法是什么呢?C#异步调用四大方法的使用是如何进行的呢?让我们首先了解下什么时候用到C#异步调用: .NET Framework 允许您C#异步调用任何方法.定义与您需要调用的方法具有 ...
- Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)
Python 在子类中调用父类方法详解(单继承.多层继承.多重继承) by:授客 QQ:1033553122 测试环境: win7 64位 Python版本:Python 3.3.5 代码实践 ...
- 「微信小程序」PHP异步进程async-helper实例详解
PHP异步进程async-helper实例详解 PHP 的异步进程助手,借助于 AMQP 实现异步执行 PHP 的方法,将一些很耗时.追求高可用.需要重试机制的操作放到异步进程中去执行,将你的 HTT ...
- C++调用JAVA方法详解
C++调用JAVA方法详解 博客分类: 本文主要参考http://tech.ccidnet.com/art/1081/20050413/237901_1.html 上的文章. C++ ...
- C#中的Linq to Xml详解
这篇文章主要介绍了C#中的Linq to Xml详解,本文给出转换步骤以及大量实例,讲解了生成xml.查询并修改xml.监听xml事件.处理xml流等内容,需要的朋友可以参考下 一.生成Xml 为了能 ...
- Linux中Nginx安装与配置详解
转载自:http://www.linuxidc.com/Linux/2016-08/134110.htm Linux中Nginx安装与配置详解(CentOS-6.5:nginx-1.5.0). 1 N ...
- Linux中/proc目录下文件详解
转载于:http://blog.chinaunix.net/uid-10449864-id-2956854.html Linux中/proc目录下文件详解(一)/proc文件系统下的多种文件提供的系统 ...
- [译]Java Thread join示例与详解
Java Thread join示例与详解 Java Thread join方法用来暂停当前线程直到join操作上的线程结束.java中有三个重载的join方法: public final void ...
随机推荐
- IIS虚拟目录内的视频文件访问出错:HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。
MIME类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开.多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式. 我是 ...
- 第一节: Timer的定时任务的复习、Quartz.Net的入门使用、Aop思想的体现
一. 前奏-Timer类实现定时任务 在没有引入第三方开源的定时调度框架之前,我们处理一些简单的定时任务同时都是使用Timer类, DotNet中的Timer类有三个,分别位于不同的命名空间下,分别是 ...
- npm常用命令学习(npm install -D,semver版本规范, npm进行版本管理的最佳实践用法)
什么是npm npm有两层含义.一层含义是Node的开放式模块登记和管理系统,网址为npmjs.org.另一层含义是Node默认的模块管理器,是一个命令行下的软件,用来安装和管理Node模块. npm ...
- [物理学与PDEs]第1章第2节 预备知识 2.3 Faraday 电磁感应定律
1. Faraday 电磁感应定律: 设 $l$ 为任一闭曲线, 则 $$\bex \oint_l{\bf E}\cdot\rd {\bf l} =-\int_S \cfrac{\p {\bf B} ...
- Jsp1
jsp代码中包含两类:jsp元素和template data. template模板 data:jsp引擎不处理的部分,就是<%....%>之外的部分,直接给浏览器显示. <%! % ...
- 终止ajax异步请求——abort()
var xhr=$.ajax(); xhr.abort();//在终止之前要确定xhr不为空
- python之造测试数据-faker(转载)
在软件需求.开发.测试过程中,有时候需要使用一些测试数据,针对这种情况,我们一般要么使用已有的系统数据,要么需要手动制造一些数据. 在手动制造数据的过程中,可能需要花费大量精力和工作量,现在好了,有一 ...
- JavaScript的数据类型和变量
1. 数据类型:JS使用弱类型,共4种基本类型,其数据可以是变量,也可以是常量. a) 数值(整数和实数) b) 字符串型(用“”号或‘’括起来的字符或数值) c) ...
- Log日志
Log.e("tag", "错误信息"); Log.w("tag", "警告信息"); Log.i("ta ...
- PHP 【一】
输出 [输出在表格中] <!DOCTYPE html> <html> <body> <h1>My first PHP page</h1> ...