C#实现异步编程的方法
作者:SmartMonkey 发布时间:2022-03-01 22:43:27
标签:C#,异步编程
最近在我参与的几个.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#的委托机制可以很方便地实现异步编程。


猜你喜欢
- 本文实例讲述了Java解析Excel内容的方法。分享给大家供大家参考。具体实现方法如下:import java.io.File;
- 经过各种各样的整理,以及和热心网友讨论,终于整理出了九种android开发中最常见的问题和解决方案再次跟大家分享下!!有用的话请顶顶帖子,共
- 题目:Binary Tree Maximum Path SumGiven a binary tree, find the maximum p
- 前言C#中Try-Catch语句大家都很熟悉了,但是细究起来,还是有很多东西可讲的。最近在翻看之前总结的常见面试题中,发现关于try...c
- 碎片,它的出现是为了更好展示UI的设计,让程序更加得到充分的展示。Fragment的出现,如微信的额主界面包含多个Fragment,使得微信
- using System;using System.Collections.Generic;using System.Linq;using
- 本文实例主要实现了网页照相机程序的功能。C#实现将网页保存成图片格式,简单实现网页拍照,主要是基于ActiveX 组件的网页快照类,Acit
- 如下所示://view重绘时回调view.getViewTreeObserver().addOnDrawListener(new OnDra
- 本文实例为大家分享了SpringMVC框架实现图片上传与下载的具体代码,供大家参考,具体内容如下1、新建一个Maven webapp项目,引
- 因工作需要,经常跟时间戳打交道,但是因为它仅仅是一个数字,我们很难直接看出它有什么意义,或两个时间戳之间究竟差了多长的间隔。于是从MSDN
- 本文实例讲述了Java递归基础与递归的宏观语意。分享给大家供大家参考,具体如下:1.什么是递归本质上,将原来的问题,转化为更小的同一问题2.
- 如图所示的效果相信大家都不陌生,我们可以使用很多种方法去实现此效果,这里自己采用CountDownTimer定时器简单封装下此效果,方便我们
- 最近为公司做的一个Demo里面用到了ScrollView嵌套了GridView和ListView,然而在嵌套的时候我发现GridView和L
- 本文为大家分享了java学生信息管理系统的源代码,供大家参考,具体内容如下/*学生信息管理系统,实现学生信息: *增加 int[] a=n
- 在c和c++中,我们知道没办法起一个变量名叫int,因为这是C/C++保留的关键字,起这么一个变量名没办法区分到底是int类型还是int变量
- 一.问题1.HashSet,TreeSet是如何使用hashCode()和equal()方法的2.TreeMap,TreeSet中的对象何时
- 本文实例为大家分享了C# picturebox实现图像拖拽和缩放的具体代码,供大家参考,具体内容如下1.核心步骤:①新建Point类型全局变
- 在手机客户端尤其是Android应用的开发过程中,我们经常会接触到“硬件加速”这个词。由于操作系统对底层软硬件封装非常完善,上层软件开发者往
- 归并排序简单解释:该算法是采用分治法,把数组不断分割,直至成为单个元素,然后比较再合并(合并的过程就是两部分分别从头开始比较,取出最小或最大
- Android 中RecyclerView顶部刷新实现详解1. RecyclerView顶部刷新的原理RecyclerView顶部刷新的实现