C# 创建线程的简单方式:异步委托 .
定义一个委托调用的方法:TakesAWhile
- //定义委托要引用的方法
- private static int TakesAWhile(int data, int ms)
- {
- Console.WriteLine("开始...");
- //当前线程(委托线程)阻塞ms毫秒
- Thread.Sleep(ms);
- Console.WriteLine("完成!");
- return ++data;
- }
//定义委托要引用的方法
private static int TakesAWhile(int data, int ms)
{
Console.WriteLine("开始...");
//当前线程(委托线程)阻塞ms毫秒
Thread.Sleep(ms);
Console.WriteLine("完成!");
return ++data;
}
定义一个委托:
- public delegate int TakesAWhileDelegate(int data, int ms);
public delegate int TakesAWhileDelegate(int data, int ms);
以下是异步调用委托的3种方式:
1.投票
- /* 异步调用委托之:投票,检查委托是否完成任务 star */
- TakesAWhileDelegate d1 = TakesAWhile;
- IAsyncResult ar = d1.BeginInvoke(1, 3000, null, null);
- //检查委托是否完成
- while (!ar.IsCompleted)
- {
- Console.WriteLine(".");
- //当前线程(主线程)阻塞500毫秒,因此最后会打出6个"."
- Thread.Sleep(500);
- }
- //EndInvoke()方法会一直等待,直到委托完成为止,用于接收结果
- int result = d1.EndInvoke(ar);
- Console.WriteLine("结果:" + result);
- /*
/* 异步调用委托之:投票,检查委托是否完成任务 star */
TakesAWhileDelegate d1 = TakesAWhile;
IAsyncResult ar = d1.BeginInvoke(1, 3000, null, null);
//检查委托是否完成
while (!ar.IsCompleted)
{
Console.WriteLine(".");
//当前线程(主线程)阻塞500毫秒,因此最后会打出6个"."
Thread.Sleep(500);
}
//EndInvoke()方法会一直等待,直到委托完成为止,用于接收结果
int result = d1.EndInvoke(ar);
Console.WriteLine("结果:" + result);
/*
2.等待句柄
- /* 异步调用委托之:等待句柄 star */
- TakesAWhileDelegate d1 = TakesAWhile;
- IAsyncResult ar = d1.BeginInvoke(1, 3000, null, null);
- while (true)
- {
- Console.WriteLine(".");
- //AsyncWaitHandle访问等待句柄
- //WaitOne()第一个参数为一超时时间,即要等待的最大时间,超时返回false,继续while循环
- if (ar.AsyncWaitHandle.WaitOne(500, false))
- {
- Console.WriteLine("可获得结果啦Baby!");
- break;
- }
- }
- //EndInvoke()方法会一直等待,直到委托完成为止,用于接收结果
- int result = d1.EndInvoke(ar);
- Console.WriteLine("结果:" + result);
- /* 异步调用委托之:等待句柄 end */
/* 异步调用委托之:等待句柄 star */
TakesAWhileDelegate d1 = TakesAWhile;
IAsyncResult ar = d1.BeginInvoke(1, 3000, null, null);
while (true)
{
Console.WriteLine(".");
//AsyncWaitHandle访问等待句柄
//WaitOne()第一个参数为一超时时间,即要等待的最大时间,超时返回false,继续while循环
if (ar.AsyncWaitHandle.WaitOne(500, false))
{
Console.WriteLine("可获得结果啦Baby!");
break;
}
}
//EndInvoke()方法会一直等待,直到委托完成为止,用于接收结果
int result = d1.EndInvoke(ar);
Console.WriteLine("结果:" + result);
/* 异步调用委托之:等待句柄 end */
3.异步回调
- //定义委托调用完毕后的回调方法
- private static void TakesAWhileCommpleted(IAsyncResult ar)
- {
- if (ar == null)
- {
- throw new ArgumentException("ar");
- }
- TakesAWhileDelegate d1 = ar.AsyncState as TakesAWhileDelegate;
- int result = d1.EndInvoke(ar);
- Console.WriteLine("结果:" + result);
- }
//定义委托调用完毕后的回调方法
private static void TakesAWhileCommpleted(IAsyncResult ar)
{
if (ar == null)
{
throw new ArgumentException("ar");
}
TakesAWhileDelegate d1 = ar.AsyncState as TakesAWhileDelegate;
int result = d1.EndInvoke(ar);
Console.WriteLine("结果:" + result);
}
- /* 异步调用委托之:异步回调 star */
- TakesAWhileDelegate d1 = TakesAWhile;
- d1.BeginInvoke(1, 3000, TakesAWhileCommpleted, d1);
- for (int i = 0; i < 100; i++)
- {
- Console.WriteLine(".");
- Thread.Sleep(500);
- }
- /* 异步调用委托之:异步回调 end */
/* 异步调用委托之:异步回调 star */
TakesAWhileDelegate d1 = TakesAWhile;
d1.BeginInvoke(1, 3000, TakesAWhileCommpleted, d1);
for (int i = 0; i < 100; i++)
{
Console.WriteLine(".");
Thread.Sleep(500);
}
/* 异步调用委托之:异步回调 end */
注:异步模式,不仅用于委托,异步模式在.NET Framework的各个地方都能见!
C# 创建线程的简单方式:异步委托 .的更多相关文章
- java创建线程的多种方式
java创建线程的四种方式 1.继承 Thread 类 通过继承 Thread 类,并重写它的 run 方法,我们就可以创建一个线程. 首先定义一个类来继承 Thread 类,重写 run 方法. 然 ...
- pthread创建线程的简单演示
使用pthread创建子线程的简单步骤 导入头文件 #import <pthread.h> 指定新线程标识符 使用pthread创建线程的函数 根据result = 0 与否判断子线程 ...
- 创建线程的一般方式和匿名内部类方式对比——实现runnable接口,重新run方法
启动:使用静态代理设计模式 优点:可同时实现继承,避免单继承局限性 一般方式: Programer.java /** * 真实角色 * * @author :liuqi * @date :2018-0 ...
- 创建线程的一般方式和匿名内部类方式对比——继承thread类,重写run()方法
第一种:继承thread类,重写run()方法 一般方式:Demo01.java /** * 创建线程的第一种方式:继承thread类,重写run()方法 * * @author :liuqi * @ ...
- Java中创建线程主要有三种方式
一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. (2)创建Thread子类的实 ...
- Java创建线程四种方式
1.继承Thread类 public class MyThread extends Thread { public MyThread() { } public void run() { for(int ...
- 多线程-创建线程第二种方式-实现Runnable接口-细节和好处
1 package multithread2; 2 3 /* 4 * 创建线程的第一种方法:继承Thread类 5 * 6 * 创建线程的第二种方式:实现Runnable接口 7 * 8 * 1,定义 ...
- Java并发编程原理与实战五:创建线程的多种方式
一.继承Thread类 public class Demo1 extends Thread { public Demo1(String name) { super(name); } @Override ...
- java多线程 -- 创建线程的第三者方式 实现Callable接口
Java 5.0 在 java.util.concurrent 提供了一个新的创建执行线程的方式:Callable 接口Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个 ...
随机推荐
- 轻松学Linux之使用转义字符
转义字符是C语言中表示字符的一种特殊形式.通常使用转义字符表示ASCII码字符集中不可打印的控制字符和特定功能的字符,如用于表示字符常量的单撇号( '),在Unix操作系统中有一类特殊的字符 ...
- JNLP + Applet + Bouncy Castle
http://stackoverflow.com/questions/4275005/jnlp-applet-bouncy-castle ——————————————————————————————— ...
- 异步编程之Promise(3):拓展进阶
异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...
- MYSQL数据库性能调优之五:解决慢查询--存储引擎与数据类型
3.数据类型的影响 4.存储引擎的影响 看你的mysql现在已提供什么存储引擎:mysql> show engines; 看你的mysql当前默认的存储引擎:mysql> show var ...
- Codeforces 100548F - Color (组合数+容斥)
题目链接:http://codeforces.com/gym/100548/attachments 有n个物品 m种颜色,要求你只用k种颜色,且相邻物品的颜色不能相同,问你有多少种方案. 从m种颜色选 ...
- Spring JTA应用JOTM & Atomikos III Atomikos
前面简单介绍了JOTM如何在Spring中配置,并如何使用它的JTA事务,本节将介绍Atomikos如何与Spring集成,并使用它的JTA事务. Atomikos,是一个基于Java的开源事务管理器 ...
- angular实践第一弹:选项卡开发
在学习angular的过程中,实践是最好的方法. 在开发选项卡的过程中,不需要再像jquery一样以DOM操作为核心,那什么样的情况是以DOM操作为核心的Jquery的思想呢? 一想到改变什么,就想设 ...
- 在jybot下跑Selenium2Library
应用场景:项目组要将原有SeleniumLibrary写的脚本切换到Selenium2Library(后称S2L)下,但是原来有很多Java写的库,综合考虑认为还是在Jython下跑比较合适.但是安装 ...
- 优化checkbox和radio,类似Bootstrap中的iCheck
checkbox和radio浏览器默认的已经满足不了大众的审美需求,更不用说浏览器之间的差异化,取而代之,优化checkbox和radio的方法也随之诞生了. html结构:单选框为例,简单说明: 其 ...
- Java中返回参数值的几种状态
Java 中无参无返回值方法的使用 第一步,定义方法 例如:下面代码定义了一个方法名为 show ,没有参数,且没有返回值的方法,执行的操作为输出 " welcome to imooc. & ...