软件编程
位置:首页>> 软件编程>> C#编程>> C#异步调用示例详解

C#异步调用示例详解

作者:千年海岩  发布时间:2023-09-12 13:02:04 

标签:C#,异步调用

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

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com