C#异步调用示例详解

所属分类: 软件编程 / C#教程 阅读数: 38
收藏 0 赞 0 分享

本文实例为大家分享了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#中Datetimepicker出现问题的解决方法

这篇文章主要给大家介绍了关于C#中Datetimepicker出现问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

C# SQLite数据库入门使用说明

这篇文章主要给大家介绍了关于C#中SQLite数据库入门使用的相关资料,文中通过图文以及示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

C#实现批量下载图片到本地示例代码

这篇文章主要给大家介绍了关于C#如何实现批量下载图片到本地的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用c#具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

如何获取C#中方法的执行时间以及其代码注入详解

这篇文章主要给大家介绍了关于如何获取C#中方法的执行时间以及其代码注入的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
收藏 0 赞 0 分享

C#中通过LRU实现通用高效的超时连接探测

这篇文章主要介绍了c#中通过LRU实现通用高效的超时连接探测,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
收藏 0 赞 0 分享

如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

这篇文章主要给大家介绍了关于如何使用C#将Tensorflow训练的.pb文件用在生产环境的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

C#程序启动项的设置方法

这篇文章主要为大家详细介绍了C#程序启动项的设置方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

c#爬虫爬取京东的商品信息

这篇文章主要给大家介绍了关于利用c#爬虫爬取京东商品信息的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们随着小编来一起学习学习吧
收藏 0 赞 0 分享

C#随机数生成字母金字塔

这篇文章主要为大家详细介绍了C#随机数生成字母金字塔,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

WPF实现窗体中的悬浮按钮

这篇文章主要为大家详细介绍了WPF实现窗体中的悬浮按钮,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享
查看更多