博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 多线程之异步回调
阅读量:5281 次
发布时间:2019-06-14

本文共 3062 字,大约阅读时间需要 10 分钟。

using System;using System.Collections.Generic;using System.Linq;using System.Runtime.Remoting.Messaging;using System.Text;using System.Threading;namespace yibu{    public delegate int AddHandler(int a,int b);    public class CAdd    {        public static int Add(int a, int b)        {            Console.WriteLine("开始计算...");            Console.WriteLine("当前线程ID:" + Thread.CurrentThread.ManagedThreadId);            Thread.Sleep(4000);            Console.WriteLine("计算完成");            return a + b;        }    }   class Program    {       void cleanup(int result)       {           Console.WriteLine("调用者继续工作");           Console.WriteLine(result);           Console.ReadKey();       }      static  void sync_call()       {           Console.WriteLine("Sync_call_test");           AddHandler handler = new AddHandler(CAdd.Add);           int result = handler.Invoke(1, 2);           Console.WriteLine("调用者继续工作");           Console.WriteLine(result);           Console.ReadKey();       }      static  void async_call()       {           Console.WriteLine("Async_call_test");           AddHandler handler = new AddHandler(CAdd.Add);           IAsyncResult result = handler.BeginInvoke(1, 2, null, null);           Console.WriteLine("调用者继续工作");           Console.WriteLine(handler.EndInvoke(result));           Console.ReadKey();       }      static  void async_callback()       {           Console.WriteLine("Async_callback_test");           AddHandler handler = new AddHandler(CAdd.Add);           IAsyncResult result = handler.BeginInvoke(1, 2, new AsyncCallback(mycall), "AsyncState:OK");           Console.WriteLine("调用者继续工作");           //Console.ReadKey();       }       static void Main()       {           Console.WriteLine("主线程ID:" + Thread.CurrentThread.ManagedThreadId);           async_callback();           Console.WriteLine("happy coding,yes");           Thread.Sleep(44000);           Console.WriteLine("Continue Happy coding");           Thread.Sleep(2000);           Console.ReadKey();       }       static void mycall(IAsyncResult result)       {           Console.WriteLine("where am i?");           Console.WriteLine("当前线程ID:" + Thread.CurrentThread.ManagedThreadId);           AddHandler handler = (AddHandler)((AsyncResult)result).AsyncDelegate;                      Console.WriteLine(handler.EndInvoke(result));           Console.WriteLine(result.AsyncState);       }    }}

代码中主函数使用的是异步回调,为了说明其优越性,代码提供了

其他两种方法来做比较:

1.同步调用,代码在sync_call函数中,

这个其实还是本线程调用,和调用个函数没区别。

2.异步调用

在async_call函数中,调用完handler.BeginInvoke 之后,主线程会继续往下执行,

但是在handler.EndInvoke的时候,如果任务没有完成,还是会阻塞在这里。

 

 

注意使用异步回调的核心代码:

 IAsyncResult result = handler.BeginInvoke(1, 2, new AsyncCallback(mycall), "AsyncState:OK");

第三个参数注册回调函数,第三个传递一个object对象。

回调函数mycall在任务线程里面执行,

AddHandler handler = (AddHandler)((AsyncResult)result).AsyncDelegate;来获取委托对象,然后再

handler.EndInvoke(result) 返回值。

 

在回调函数中获取主线程的委托对象还可以使用如下方法:

在BeginInvoke的时候将  ,委托对象传到第四个参数,

回调函数中使用result.AsynState 再转成(AddHandler)

AddHandler handler = (AddHandler)(result.AsyncState);

转载于:https://www.cnblogs.com/legion/p/9072307.html

你可能感兴趣的文章
数据库备份问题
查看>>
前端面试题(4)iframe有哪些优点?iframe缺点是什么?
查看>>
第十六章 多态性(一)
查看>>
INSERT IGNORE INTO / REPLACE INTO
查看>>
Python数据类型-布尔/数字/字符串/列表/元组/字典/集合
查看>>
MFC中theApp
查看>>
类的无参方法
查看>>
Python 开发:初识Python(记笔记)
查看>>
sqlrelay 的安装配置和应用
查看>>
【刷题】SPOJ 705 SUBST1 - New Distinct Substrings
查看>>
IEEE 754浮点数表示标准
查看>>
WebService客户端几种实现方式
查看>>
Lua1.1 Lua 的参考手册 (二)
查看>>
linux下mysql的root密码忘记解决方
查看>>
javascript学习笔记 - 引用类型 单体内置对象
查看>>
LeetCode-Pascal's Triangle II-帕斯卡三角-DP
查看>>
boot空间不足
查看>>
在ASP.NET项目中的web.config文件里配置数据库连接并在程序代码中获取连接字符串...
查看>>
poj 1170 Shopping Offers
查看>>
第五周学习进度条
查看>>