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

posted @   千年海岩  阅读(956)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
点击右上角即可分享
微信分享提示