C#实现异步编程的方法

发布时间 - 2026-01-11 02:34:56    点击率:

最近在我参与的几个.Net项目中都有用到异步编程,作为一名.Net小白,很有必要好好地学习一下C#异步编程。

什么是异步

异步指的就是不用阻塞当前线程来等待任务的完成,而是将任务扔到线程池中去执行,当前线程可以继续向下执行,直至其它线程将任务完成,并回调通知当前线程。整个任务从开始到结束都是异步完成的,不会阻塞当前线程。因此,异步很重要的一点就是,不会阻塞当前线程。

实现异步编程

在C#语言中,主要是通过委托来实现异步编程的,在委托类型中定义了两个方法BeginInvoke()和EndInvoke()。

/// <summary>
/// 开始执行异步操作.
/// </summary>
/// <param name="param">委托方法的参数</param>
/// <param name="callback"></param>
/// <param name="object"></param>
/// <returns></returns>
IAsyncResult BeginInvoke(int param, AsyncCallback callback, Object @object);

/// <summary>
/// 结束执行异步操作,并且返回异步操作结果.
/// </summary>
/// <param name="result"></param>
/// <returns>委托方法的返回类型</returns>
string EndInvoke(IAsyncResult result);

下面就通过一段代码来具体实现异步编程

/// <summary>
/// 定义一个委托类型
/// </summary>
public delegate string Del();

/// <summary>
/// 任务类
/// </summary>
public class TaskClass
{
  public static string SleepTask()
  {
    Console.WriteLine("异步线程(ThreadId = {0})开始执行睡眠任务,睡眠3s.\n", Thread.CurrentThread.ManagedThreadId);

    Thread.Sleep(3000);

    Console.WriteLine("异步线程(ThreadId = {0})苏醒,睡眠任务执行结束.\n", Thread.CurrentThread.ManagedThreadId);

    return "异步线程执行成功.\n";
  }
}
  
/// <summary>
/// 异步编程实现类(主线程不会阻塞)
/// </summary>
public class AsynCallbackClass
{
  public static string result;

  public static void Main(string[] args)
  {
    Console.WriteLine("主线程(ThreadId = {0})开始执行.\n", Thread.CurrentThread.ManagedThreadId);

    Del del = new Del(TaskClass.SleepTask);

    Console.WriteLine("主线程(ThreadId = {0})调用BeginInvoke()方法执行异步任务.\n", Thread.CurrentThread.ManagedThreadId);

    //开始执行异步操作,TaskClass.SleepTask无参数,Callback为定义的回调方法.
    del.BeginInvoke(Callback, null);

    Console.WriteLine("主线程(ThreadId = {0})继续执行.\n", Thread.CurrentThread.ManagedThreadId);

    Thread.Sleep(5000);

    //输出异步任务返回的结果
    Console.WriteLine(result);

    Console.WriteLine("主线程(ThreadId = {0})执行结束.\n", Thread.CurrentThread.ManagedThreadId);
  }

  /// <summary>
  /// 回调方法
  /// </summary>
  /// <param name="ar"></param>
  public static void Callback(IAsyncResult ar)
  {
    AsyncResult asyncResult = ar as AsyncResult;

    if (asyncResult == null) { return; }

    Del del = asyncResult.AsyncDelegate as Del;

    if (del == null) { return; }

    Console.WriteLine("回调方法中调用EndInvoke()方法,获取异步任务结果.\n", Thread.CurrentThread.ManagedThreadId);
    
    //结束执行异步操作,并返回异步任务结果.
    result = del.EndInvoke(ar);
  }
}

运行结果:

从运行结果中,我们可以发现主线程在调用了BeginInvoke()方法后,没有阻塞,而是继续向下执行,而且任务也确实由一个新的线程来执行,任务执行结束后,调用回调方法,在回调方法中调用EndInvoke()方法来获取任务执行结果。

总结

1. 在异步编程中,当前线程是不会被阻塞的。

2. C#的委托机制可以很方便地实现异步编程。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# C#  # 异步编程  # c# 异步编程基础讲解  # c# 异步编程入门  # c# 使用异步编程的方法  # C#异步编程几点需要注意的地方  # C#异步编程详解  # 基于C#的socket编程的TCP异步的实现代码  # 解析C#多线程编程中异步多线程的实现及线程池的使用  # 深入分析C#异步编程详解  # C#中异步Socket通信编程代码实例  # C#异步编程的三种模式  # 回调  # 都是  # 几个  # 都有  # 在我  # 很有  # 我们可以  # 很重要  # 来实现  # 方法来  # 很方便  # 作为一名  # 扔到  # 大家多多  # 池中  # 主要是  # 结束后  # 好好地  # lt  # pre 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  googleplay官方入口在哪里_Google Play官方商店快速入口指南  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  Laravel如何实现多对多模型关联?(Eloquent教程)  如何在建站宝盒中设置产品搜索功能?  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  图册素材网站设计制作软件,图册的导出方式有几种?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  敲碗10年!Mac系列传将迎来「触控与联网」双革新  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  JavaScript模板引擎Template.js使用详解  怎么用AI帮你设计一套个性化的手机App图标?  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  javascript读取文本节点方法小结  EditPlus中的正则表达式实战(5)  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  如何正确选择百度移动适配建站域名?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  IOS倒计时设置UIButton标题title的抖动问题  青岛网站建设如何选择本地服务器?  Python文件流缓冲机制_IO性能解析【教程】  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  郑州企业网站制作公司,郑州招聘网站有哪些?  Laravel如何实现本地化和多语言支持?(i18n教程)  如何快速生成高效建站系统源代码?  Laravel怎么在Blade中安全地输出原始HTML内容  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  桂林网站制作公司有哪些,桂林马拉松怎么报名?  如何在Ubuntu系统下快速搭建WordPress个人网站?  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  如何快速搭建支持数据库操作的智能建站平台?  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  如何快速生成橙子建站落地页链接?  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  在线制作视频网站免费,都有哪些好的动漫网站?  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  无锡营销型网站制作公司,无锡网选车牌流程?  canvas 画布在主流浏览器中的尺寸限制详细介绍  jQuery 常见小例汇总  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  Laravel Docker环境搭建教程_Laravel Sail使用指南  网站制作价目表怎么做,珍爱网婚介费用多少?  javascript基本数据类型及类型检测常用方法小结