C#异步调用示例详解

Lewa ·
更新时间:2024-09-20
· 742 次阅读

本文实例为大家分享了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# Invoke和BeginInvoke 区别分析C#中Invoke 和 BeginInvoke 的真正涵义C#线程 BeginInvoke和EndInvoke使用方法基于使用BeginInvoke,EndInvoke异步调用委托的实现代码C#中一个高性能异步socket封装库的实现思路分享C#实现异步编程的方法C#多线程与异步的区别详解浅谈C#中的委托、事件与异步c#中Winform实现多线程异步更新UI(进度及状态信息)C#用委托BeginInvoke做异步线程



调用 示例 异步 异步调用 C#

需要 登录 后方可回复, 如果你还没有账号请 注册新账号