C#中通过BeginInvoke()和EndInvoke()来实现异步

.NET Framework允许异步调用任何方法。定义与需要调用的方法具有相同签名的委托;公共语言运行库将自动为该委托定义具有适当签名的 BeginInvoke 和 EndInvoke 方法。以下介绍C#中,通过BeginInvoke()和EndInvoke()来实现异步。

1、异步编程

调用BeginInvoke可以执行任务,然后调用EndInvoke阻塞直到调用完成。使用IAsyncResult.AsyncWaitHandle属性获取WaitHandle ,使用其WaitOne方法阻止执行,直到发出WaitHandle信号,然后调用EndInvoke轮询返回的IAsyncResultBeginInvoke以确定异步调用何时完成,然后调用EndInvoke。将回调方法的委托传递给BeginInvoke。当异步调用完成时,该方法在ThreadPool线程上执行。回调方法调用EndInvokeBeginInvoke 立即返回,不等待异步调用完成。BeginInvoke 返回 IasyncResult,可用于监视调用进度。EndInvoke 方法用于检索异步调用结果。调用 BeginInvoke 后可随时调用 EndInvoke 方法;如果异步调用未完成,EndInvoke 将一直阻塞到异步调用完成。

2、同步方法和异步方法区别

同步方法调用在程序继续执行之前,需要等待同步方法执行完毕返回结果,异步方法则在被调用之后,立即返回以便程序在被调用方法完成其任务的同时执行其它操作。

3、异步操作的优缺点

异步操作无须额外的线程负担,并且使用回调的方式进行处理,在设计良好的情况下,处理函数可以不必使用共享变量,即使无法完全不用,最起码可以减少共享变量的数量,减少了死锁的可能。当然异步操作也并非完美。编写异步操作的复杂程度较高,程序主要使用回调方式进行处理,与普通人的思维方式有些初入,而且难以调试。

4、BeginInvoke()和EndInvoke()的使用

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<DateTime> func = () =>
            {
                Thread.Sleep(1000);
                return DateTime.Now;
            };
            Console.WriteLine($"func.Invoke()={func.Invoke()}");
            //EndInvoke(r)用来获取执行后的返回值,BeginInvoke()的第一个参数是func执行完成后回调用函数
            IAsyncResult asyncResult = func.BeginInvoke(r =>
            {
                //Console.WriteLine(func.EndInvoke(r));
                Console.WriteLine(r.AsyncState);
            }, "cjavapy");
            //asyncResult.AsyncWaitHandle.WaitOne();一直等到完成后,才会执行下一行代码
            //asyncResult.AsyncWaitHandle.WaitOne(5000);指定等待超时的时间为5s
            Console.WriteLine(func.EndInvoke(asyncResult));
            //Thread.Sleep(6000);
        }
    }
}

注意EndInvoke()获取返回值只能调用一次,不能重复调用。

相关推荐
中文很快乐1 分钟前
java后端好习惯---新手养成记
java·开发语言·开发好习惯·踩坑日志·新手养成
风华同学1 分钟前
【系统移植篇】系统烧写
java·开发语言·前端
by__csdn3 分钟前
JavaScript性能优化实战:异步与延迟加载全方位攻略
开发语言·前端·javascript·vue.js·react.js·typescript·ecmascript
阿里嘎多学长4 分钟前
2025-12-11 GitHub 热点项目精选
开发语言·程序员·github·代码托管
diudiu96289 分钟前
Logback使用指南
java·开发语言·spring boot·后端·spring·logback
程序喵大人10 分钟前
记录va_list重复使用导致的crash
开发语言·c++
2501_9307077813 分钟前
如何使用C#代码将多张图片整合为一个PDF文档
开发语言·pdf·c#
CryptoPP14 分钟前
期货数据获取与可视化全攻略:从API对接至K线图生成
运维·服务器·开发语言·数据结构·金融
C++业余爱好者16 分钟前
JVM优化入门指南:JVM新生代、老年代的核心概念与内存分配逻辑
java·开发语言·jvm
赵庆明老师17 分钟前
NET 10 中DLL,并发布到NuGet
服务器·c#·.net