C#的异步回调函数

落芳同学_3871

落芳同学_3871

2016-10-13

3158人浏览

原创

关于c#的异步回调,在actionscript 3.0当中 , 有关键字function , 可以直接传class函数为回调函数。但是在c#当中,需要使用到委托,其中应用的最多的当属 : action / func 。当然你可以使用关键字delegate来自定义委托。这里翼action /  func为例来讲解c#的异步回调,如果不了解c#的委托机制,需要自己先百度/google一下,再来看这篇博客。



BeginInvoke 方法用于启动异步调用。它与您需要异步执行的方法具有相同的参数,只不过还有后面的两个额外的参数:第一个 : 异步调用执行完毕后的回调函数 , 此函数有一个参数 : IAsyncResult 。第二个为状态Object,可以传任意的值 , 用IAsyncResult.AsyncState进行接收。

需要注意的是 : 对于有Return(返回值)的异步调用函数,如何获得其返回值 : EndInvoke方法,值得注意的EndInvoke方法 : 可在异步调用结束后的回调函数中执行 ,也可以在异步调用代码后执行 : 只是这回当作是同步函数执行(异步函数被当作同步函数执行),理解为 , 现在就想拿到Return结果,所以停留在此,等待结果Return后,再往后面执行,相当于同步函数。


好了 , 结束废话 , 上正文:

1using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace AnycCallBack161005.com
{
    public class Anyc
    {
        private Dictionary<action>, IAsyncResult> noReturnDic;
        private Dictionary<func>, IAsyncResult> hasReturnDic;
 
        public Anyc()
        {
            this.noReturnDic = new Dictionary<action>, IAsyncResult>();
            this.hasReturnDic = new Dictionary<func>, IAsyncResult>();
        }
 
        public void DoAction(Action<int> callBack , int a , int b )
        {
            if(callBack != null)
            {
                if(this.noReturnDic.ContainsKey(callBack))
                {
                    callBack.EndInvoke(this.noReturnDic[callBack]);//强制执行上回的CallBack
                }
                this.noReturnDic[callBack] = callBack.BeginInvoke(a, b, this.DoActionComplete, callBack);
            }
        }
        private void DoActionComplete( IAsyncResult ar )
        {
            Action<int> callBack = ar.AsyncState as Action<int>;
            this.noReturnDic.Remove(callBack);
        }
 
        public void DoFunc( Func<int> callBack , int a , int b )
        {
            if(callBack != null)
            {
                if(this.hasReturnDic.ContainsKey(callBack))
                {
                    int re = callBack.EndInvoke(this.hasReturnDic[callBack]);
                    Console.WriteLine("得到的结果为 {0} ", re);
                }
                this.hasReturnDic[callBack] = callBack.BeginInvoke(a,b,this.DoFuncComplete,callBack);
            }
        }
        private void DoFuncComplete(IAsyncResult ar)
        {
            Func<int> callBack = ar.AsyncState as Func<int>;
            int re = callBack.EndInvoke(ar);
            Console.WriteLine("得到的结果为* {0} ", re);
            this.hasReturnDic.Remove(callBack);
        }
    }
}</int></int></int></int></int></int></func></action></func></action>

//调用代码 :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AnycCallBack161005.com;
 
namespace AnycCallBack161005
{
    class Program
    {
        static void Main(string[] args)
        {
            Action<int> testActionAnyc = ( a , b ) =>Console.WriteLine("Action得到的结果 : {0}",(a+b).ToString());
            Func<int> testFuncAnyc = (a, b) => a + b;
            Anyc anyc = new Anyc();
            anyc.DoAction(testActionAnyc, 3, 4);
            anyc.DoAction(testActionAnyc, 3, 5);
            anyc.DoAction(testActionAnyc, 3, 6);
            anyc.DoFunc(testFuncAnyc, 7, 8);
            anyc.DoAction(testActionAnyc, 3, 7);
            anyc.DoAction(testActionAnyc, 3, 8);
             
            Console.Read();
        }
    }
}</int></int>

结果:

1.png

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

40

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

20

15

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

2026.10.28

40

10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

120

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

80

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

80

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

40

10

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

2026.10.22

80

25

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

2026.10.22

40

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习