C#异步调用示例详解
作者:千年海岩 时间:2023-09-12 13:02:04
本文实例为大家分享了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) :在创建控件的基础句柄所在线程上异步执行指定委托。
标签:C#,异步调用
0
投稿
猜你喜欢
关于Mybatis-Plus Wrapper是否应该出现在Servcie类中
2023-11-28 22:04:56
使用jenkins部署springboot项目的方法步骤
2022-06-05 05:18:31
C# 弹出窗口show()和showdialog()的两种方式
2022-05-08 17:12:36
static关键字有何魔法?竟让Spring Boot搞出那么多静态内部类(推荐)
2022-07-03 20:26:29
C#数据结构之双向链表(DbLinkList)实例详解
2023-08-23 08:56:44
spring boot 日志配置详解
2023-09-24 00:23:11
C# 生成随机数的代码
2021-06-16 06:05:43
Android编程使用GestureDetector实现简单手势监听与处理的方法
2021-11-18 17:07:43
java list,set,map,数组间的相互转换详解
2023-04-11 13:02:04
Spring boot配置绑定和配置属性校验的方式详解
2022-04-21 03:06:06
Android版本更新实例详解
2023-08-05 21:54:54
c#委托与事件(详解)
2022-12-06 04:50:47
java数据结构基础:单链表与双向链表
2023-03-02 09:21:59
Spring Bean创建流程分析讲解
2022-04-20 22:53:07
Flutter加载图片流程之ImageCache源码示例解析
2023-07-04 01:56:23
jdbc中class.forname的作用
2023-04-13 00:56:18
死磕 java同步系列之synchronized解析
2023-09-27 10:07:43
详解Android Activity的启动流程
2023-07-29 08:06:19
MyBatis之自查询使用递归实现 N级联动效果(两种实现方式)
2023-04-15 03:34:50
JMeter中的后端监听器的实现
2022-07-24 17:58:35