C#基础之--线程、任务和同步:一、异步委托
创建线程的一种简单方式是定义一个委托,并异步调用它。委托是方法的类型安全的引用。
Delegate还支持异步地调用方法。在后台Delegate类会创建一个执行任务的线程。
为了说明委托的异步特性,从一个需要一定的时间才能执行完毕的方法开始。 TakesAWhile方法至少需要经过第2个变量传递的毫秒数才能执行完,因 为它调用了Thread.Sleep()方法。

- static int TakesAWhile(int data, int ms)
- {
- Console.WriteLine("TakesAWhile,start");
- Thread.Sleep(ms);
- Console.WriteLine("\nTakesAWhile complated");
- return ++data;
- }

要从委托中调用这个方法 ,必须定义一个有相同参数和返回类型的委托 ,如下面的TakesAWhileDelegate方法所示:
- public delegate int TakesAWhileDelegate(int data,int ms);
现在可以使用不同的技术异步地调用委托,并返回结果。
1、投票

- static void Main(string[] args)
- {
- TakesAWhileDelegate d1 = TakesAWhile;
- IAsyncResult ar = d1.BeginInvoke(1, 5000, null, null);
- while (!ar.IsCompleted)
- {
- Console.Write(".");
- Thread.Sleep(50);
- }
- int result = d1.EndInvoke(ar);
- Console.WriteLine("result:{0}", result);
- Console.ReadKey();
- }

运行结果:
.TakesAWhile,start
................................................
TakesAWhile complated
result:2
2、等待句柄

- static void Main(string[] args)
- {
- TakesAWhileDelegate d1 = TakesAWhile;
- IAsyncResult ar = d1.BeginInvoke(1, 5000, null, null);
- while (true)
- {
- Console.Write(".");
- if (ar.AsyncWaitHandle.WaitOne(50, false))
- {
- Console.WriteLine("\nCan get the result now");
- break;
- }
- }
- int result = d1.EndInvoke(ar);
- Console.WriteLine("result:{0}", result);
- Console.ReadKey();
- }

3、异步回调

- class Program
- {
- public delegate int TakesAWhileDelegate(int data,int ms);
- static void Main(string[] args)
- {
- TakesAWhileDelegate d1 = TakesAWhile;
- d1.BeginInvoke(1, 3000, TakesAWhileComplated, d1);
- for (int i = 0; i < 100; i++)
- {
- Console.Write(".");
- Thread.Sleep(50);
- }
- Console.ReadKey();
- }
- static int TakesAWhile(int data, int ms)
- {
- Console.WriteLine("TakesAWhile,start");
- Thread.Sleep(ms);
- Console.WriteLine("\nTakesAWhile complated");
- return ++data;
- }
- public static void TakesAWhileComplated (IAsyncResult ar)
- {
- if (ar == null) throw new ArgumentNullException("ar");
- TakesAWhileDelegate d1 = ar.AsyncState as TakesAWhileDelegate;
- Trace.Assert(d1 != null, "Invalid object type");
- int result = d1.EndInvoke(ar);
- Console.WriteLine("result:{0}", result);
- Console.ReadKey();
- }
- }

运行结果:
- .TakesAWhile,start
- ................................................
- TakesAWhile complated
- result:2
- ...................................................
TakesAWhileComplated方法用AsyncCallback委托指定的参数和返回类型来定义 。 用BeginInvoke方法传递的最后一个参数可以使用ar.AsyncState读取。在TakesAWhileDelegate委托中,可以调用EndInvoke方法来获得结果。
注意:使用回调方法,必须注意这个方法从委托的线程中调用,而不是从主线程中调用。
编程模型和所有这些包含异步委托的选项--投票、等待句柄和异步回调--不仅能用于委托。相同的编程模型(即异步模式)在.NET Framework的各个地方都能见到。
例如,可以用HttpWebReques类的BeginGetResponse()方法异步发送HTTP Web请求,使用SqlComand类的BeginExecuteReader()方法给数据库发送异步请求。
这些参数类似于委托的BeginInvoke()方法的参数,也可以使用相同的方式获得结果。
C#基础之--线程、任务和同步:一、异步委托的更多相关文章
- spring线程池的同步和异步(1)
spring线程池(同步.异步) 一.spring异步线程池类图 二.简单介绍 2.1. TaskExecutor---Spring异步线程池的接口类,其实质是java.util.concurrent ...
- 4月27日 python学习总结 GIL、进程池、线程池、同步、异步、阻塞、非阻塞
一.GIL:全局解释器锁 1 .GIL:全局解释器锁 GIL本质就是一把互斥锁,是夹在解释器身上的, 同一个进程内的所有线程都需要先抢到GIL锁,才能执行解释器代码 2.GIL的优缺点: 优点: 保 ...
- 什么是java的线程安全?同步,异步
线程是比进程更小的执行单位,是在进程基础上进行的进一步划分.所谓多线程是指进程在执行过程中可以产生多个同时存在.同时运行的线程.多进程机制可以合理利用资源,提高程序的运行效率.一个进程至少包含一个线程 ...
- GIL全局解释器锁+GIL全局解释器锁vs互斥锁+定时器+线程queue+进程池与线程池(同步与异步)
以多线程为例写个互斥锁 from threading import Thread ,Lockimport timemutex = Lock() n = 100 def task(): global n ...
- C# 创建线程的简单方式:异步委托 .
定义一个委托调用的方法:TakesAWhile //定义委托要引用的方法 private static int TakesAWhile(int data, int ms) { Console.Writ ...
- JavaScript:彻底理解同步、异步和事件循环(Event Loop) (转)
原文出处:https://segmentfault.com/a/1190000004322358 一. 单线程 我们常说"JavaScript是单线程的". 所谓单线程,是指在JS ...
- JavaScript:彻底理解同步、异步和事件循环(Event Loop)
一. 单线程 我们常说"JavaScript是单线程的". 所谓单线程,是指在JS引擎中负责解释和执行JavaScript代码的线程只有一个.不妨叫它主线程. 但是实际上还存在其他 ...
- [转] JavaScript:彻底理解同步、异步和事件循环(Event Loop)
一. 单线程 我们常说“JavaScript是单线程的”. 所谓单线程,是指在JS引擎中负责解释和执行JavaScript代码的线程只有一个.不妨叫它主线程. 但是实际上还存在其他的线程.例如:处理A ...
- python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)
python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程 并行与并发 同步与异步 阻塞与非阻塞 CPU密集型与IO密集型 线程与进程 进 ...
- [多线程]线程基础(对象锁、class锁、同步、异步)
synchronized.volatile.ReentrantLock.concurrent 线程安全:当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法) ...
随机推荐
- new和delete的基本用法
前言 new和delete是C++中用来动态管理内存分配的运算符,其用法较为灵活.如果你对它们的几种不同用法感到困惑,混淆,那么接着看下去吧. 功能一:动态管理单变量/对象空间 下面例子使用new为单 ...
- git 安装及命令
一.window下的git安装 1.安装教程 网上教程一堆.我參考的是这个:Git_Windows 系统下Git安装图解 还有这个也不错 2.环境搭建: 在配置完毕后,自己主动载入到系统环境变量中.如 ...
- SAM4E单片机之旅——7、LED闪烁之TC中断
RTT主要用做一个全局的定时器,而且不太通用.现在尝试使用一个更为通用的定时器进行定时:定时计数器(Timer Counter, TC). TC提供了广泛的功能,主要可以分为对输入的测量,以及波形的输 ...
- Lombok引入简化Java代码
转载 http://t.cn/RS0UdrX Lombok简介 如Github上项目介绍所言,Lombok项目通过添加“处理程序”,使java成为一种更为简单的语言.作为一个Old Java Deve ...
- 统计 与 数学 induction 归纳 deduction 演绎 吴喜之老师
“统计的思维方式是归纳(induction),也就是从数据所反映的现实得到比较一般的模型,希望以此解释数据所代表的那部分世界.这和以演绎(deduction)问哦主的数学思维方式相反,演绎是在一些人为 ...
- IOS 文件夹结构
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/MyGameZone/article/details/24494765 IOS文件夹结构 说明 这些仅 ...
- Linux服务器Java输出文件中文乱码
使用下面语句查看编码: String encoding = System.getProperty("file.encoding");结果输出:ANSI_X3.4-1968,从而导致 ...
- CSS Overflow 属性清除浮动
清除浮动 设置overflow的一个更流行的用处是,说也奇怪,清除浮动.设置overflow并不会在该元素上清除浮动,它将清除自己(self-clear).意思就是,应用了overflow(auto或 ...
- 分布式锁(Redis实现)
1.分布式锁解决方案 1.采用数据库 不建议 性能不好 jdbc 2.基于Redis实现分布式锁(setnx)setnx也可以存入key,如果存入key成功返回1,如果存入的key已经存在了,返回 ...
- jenkins页面不刷新,设置tomcat缓存
装jenkins的时候,部署后,访问jenkins页面,输入管理员密码后,出现jenkins页面停滞,看后台catlina日志,发现需要增加tomcat容器的cache,才能加载一些jar包,下面是设 ...