多线程的异步委托初识

异步委托的的原理就是使用了一个线程池去执行了一个委托指向的方法

EndInvoke会阻塞当前主线程,直到异步委托执行完成之后,才能继续向下执行

示例代码如下:

static void Main(string[] args)
        {
            //这里写了一个泛型委托,前两个是传递的参数,后一个是返回值,这个泛型委托调用的是AddMethod方法
            Func<int, int, int> delFun = new Func<int, int, int>(AddMethod);
            //这里是开始异步的调用这个泛型委托,传入前两个参数,之后可以执行回调函数AfterThread,如果没有可以设置为null
            //如果想要取回返回值,就可以选择把委托自身作为回调函数的参数传入,回调函数的参数类型是IAsyncResult类型
            delFun.BeginInvoke(5, 7, AfterThread, delFun);
            Console.ReadKey();
        }

        public static int AddMethod(int a,int b)
        {
            //这里停顿两秒,是为了验证EndInvoke会阻塞当前主线程的效果
            Thread.Sleep(2000);
            return a + b;
        }

        public static void AfterThread(IAsyncResult sr)
        {
            //AsyncResult result = (AsyncResult)sr;//拿到异步委托的执行结果,但是接受的类型是IAsyncResult的子类型AsyncResult,所以要强制转换一下
            //var del = (Func<int, int, int>)result.AsyncDelegate;//这个可以拿到委托实例,但是要看一下委托实例是什么类型,就要把这个实例转化为什么类型
            //Console.Write("异步执行后调用的回调函数方法" + del.EndInvoke(result));//这里调用EndInvoke事件,得到异步委托的执行结果

            //这里得到回调函数的参数,因为参数是传入的委托,所以可以得到一个委托对象
            var result = (Func<int, int, int>)sr.AsyncState;
            //result.EndInvoke(sr)就是调用委托的EndInvoke方法得到异步委托的执行结果,参数就是IAsyncResult类型
            Console.Write(result.EndInvoke(sr));
        }
时间: 2024-11-08 21:38:23

多线程的异步委托初识的相关文章

C# 多线程操作之异步委托

标签: 多线程任务nullstringhtml工作 2012-06-29 23:00 1276人阅读 评论(0) 收藏 举报  分类: C/C++/C#/dotnet(126)  目录(?)[+] 在应届生找工作的时候,多线程操作几乎是所有的公司都会问及的一个基本问题. 这里做了一个多线程操作的总结,这里总结了通过异步委托来实现多线程操作. 定义一个委托,是创建一个线程的最简单的方法,并且异步调用它.委托是方法的类型安全的引用.同时委托还智齿异步调用方法. 委托使用线程池来完成异步任务. 当自己

初步谈谈 C# 多线程、异步编程与并发服务器

多线程与异步编程可以达到避免调用线程异步阻塞作用,但是两者还是有点不同. 多线程与异步编程的异同: 1.线程是cpu 调度资源和分配的基本单位,本质上是进程中的一段并发执行的代码. 2.线程编程的思维符合正常人的思维习惯,线程中的处理程序依然是顺序执行,所以编程起来比较方便,但是缺点也是明显的,多线程的使用会造成多线程之间的上下文切换带来系统花销,并且共享变量之间也是会造成死锁的问题. 3.因为异步操作无须额外的线程负担,并且使用回调的方式进行处理,在设计良好的情况下,处理函数可以不必使用共享变

一位牛人的多线程和异步调用文章

转自小顾问原文 一位牛人的多线程和异步调用文章 首先申明:这篇文章不是我写的,我看到的一位牛人的,自己慢慢的消化了…… 摘要:本章讨论与智能客户端应用程序中多线程的使用有关的问题.为了最大限度地提高智能客户端应用程序的响应能力,需要仔细考虑如何和何时使用多线程.线程可以大大提高应用程序的可用性和性能,但是当您确定它们将如何与用户界面交互时,需要对其进行非常仔细的考虑. 线程是基本执行单元.单线程执行一系列应用程序指令,并且在应用程序中从头到尾都经由单一的逻辑路径.所有的应用程序都至少有一个线程,

c# 多线程与异步调用

异步操作的本质 在方法调用前为异步方法指定一个回调函数,方法调用后被线程池中的一个线程接管,执行该方法.主线程立即返回,继续执行其他工作或响应用户请求.如果异步方法执行完 毕,回调函数被自动执行,以处理异步方法的调用结果. 如何实现异步方法呢?C#通过异步委托调用BeginInvoke和EndInvoke方法来实现异步方法. BeginInvoke方法原型: IAsyncResult BeginInvoke(......, AsyncCallback callback, object o); .

c#并行任务多种优化方案分享(异步委托)

遇到一个多线程任务优化的问题,现在解决了,分享如下. 假设有四个任务: 任务1:登陆验证(CheckUser) 任务2:验证成功后从Web服务获取数据(GetDataFromWeb) 任务3:验证成功后从数据库获取数据(GetDatFromDb) 任务4:使用2.3的数据执行一个方法 (StartProcess) 一个比较笨的方法(本人最开始的方法,记为方法1)是直接开启一个线程,按照顺序依次执行四个任务: new Thread(delegate                {        

异步委托

委托实现多窗体传值 主窗体的代码: public partial class FrmMain : Form { //[3] 创建委托对象(委托对象能够将委托和具体方法关联) public ShowCounterDelegate msgSender; public FrmMain() { InitializeComponent(); //创建从窗体对象 FrmOther01 objFrm01 = new FrmOther01(); FrmOther02 objFrm02 = new FrmOthe

第一章 管理程序流 之 实现多线程和异步处理

1. 概述 本章主要讲解.net4.5如何实现多线程和异步处理的相关内容. 2. 主要内容 2.1 理解线程 ① 使用Thread类   public static class Program   {       public static void ThreadMethod()       {           for (int i = 0; i < 10; i++)           {               Console.WriteLine(“ThreadProc: {0}”,

01-多线程及异步委托

一.多线程: 1.概念: 线程:是Windows任务调度的最小单位.线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针.程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数. 多线程:是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务(代码),也就是说允许单个程序创建多个并行执行的线程来完成各自的任务. 2.为什么要用多线程: ①让计算机"同时"做多件事情,节约时间. ②多线程可以让一个程序“同时”处理多个事情. ③后台运行程序,

NET中的并行编程(TPL)——多线程、异步、任务和并行计算

https://masuit.com/1201 谈一谈.NET中的并行编程(TPL)——多线程.异步.任务和并行计算 懒得勤快 发表于2018-04-26 19:41:00 | 最后修改于2018-06-27 23:44:40 .NET 多线程 异步 高并发 分类:.NET开发技术 | 评论总数:0条 | 热度:2243℃ 我要编辑 写在前面: 在做了几个月的高并发项目的过程中,其实发现自己真的提升了不少,所以也想把这段时间的收获分享给大家,然后写这篇文章发现,写下来是一发不可收拾,所以这篇文章