定义一个委托调用的方法:TakesAWhile

  1. //定义委托要引用的方法
  2. private static int TakesAWhile(int data, int ms)
  3. {
  4. Console.WriteLine("开始...");
  5. //当前线程(委托线程)阻塞ms毫秒
  6. Thread.Sleep(ms);
  7. Console.WriteLine("完成!");
  8. return ++data;
  9. }

//定义委托要引用的方法
private static int TakesAWhile(int data, int ms)
{
Console.WriteLine("开始...");

//当前线程(委托线程)阻塞ms毫秒
Thread.Sleep(ms);

Console.WriteLine("完成!");

return ++data;
}

定义一个委托:

  1. public delegate int TakesAWhileDelegate(int data, int ms);

public delegate int TakesAWhileDelegate(int data, int ms);

以下是异步调用委托的3种方式:

1.投票

  1. /* 异步调用委托之:投票,检查委托是否完成任务 star */
  2. TakesAWhileDelegate d1 = TakesAWhile;
  3. IAsyncResult ar = d1.BeginInvoke(1, 3000, null, null);
  4. //检查委托是否完成
  5. while (!ar.IsCompleted)
  6. {
  7. Console.WriteLine(".");
  8. //当前线程(主线程)阻塞500毫秒,因此最后会打出6个"."
  9. Thread.Sleep(500);
  10. }
  11. //EndInvoke()方法会一直等待,直到委托完成为止,用于接收结果
  12. int result = d1.EndInvoke(ar);
  13. Console.WriteLine("结果:" + result);
  14. /*

/* 异步调用委托之:投票,检查委托是否完成任务 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.等待句柄

  1. /* 异步调用委托之:等待句柄 star */
  2. TakesAWhileDelegate d1 = TakesAWhile;
  3. IAsyncResult ar = d1.BeginInvoke(1, 3000, null, null);
  4. while (true)
  5. {
  6. Console.WriteLine(".");
  7. //AsyncWaitHandle访问等待句柄
  8. //WaitOne()第一个参数为一超时时间,即要等待的最大时间,超时返回false,继续while循环
  9. if (ar.AsyncWaitHandle.WaitOne(500, false))
  10. {
  11. Console.WriteLine("可获得结果啦Baby!");
  12. break;
  13. }
  14. }
  15. //EndInvoke()方法会一直等待,直到委托完成为止,用于接收结果
  16. int result = d1.EndInvoke(ar);
  17. Console.WriteLine("结果:" + result);
  18. /* 异步调用委托之:等待句柄 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.异步回调

  1. //定义委托调用完毕后的回调方法
  2. private static void TakesAWhileCommpleted(IAsyncResult ar)
  3. {
  4. if (ar == null)
  5. {
  6. throw new ArgumentException("ar");
  7. }
  8. TakesAWhileDelegate d1 = ar.AsyncState as TakesAWhileDelegate;
  9. int result = d1.EndInvoke(ar);
  10. Console.WriteLine("结果:" + result);
  11. }

//定义委托调用完毕后的回调方法
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);
}

  1. /* 异步调用委托之:异步回调 star */
  2. TakesAWhileDelegate d1 = TakesAWhile;
  3. d1.BeginInvoke(1, 3000, TakesAWhileCommpleted, d1);
  4. for (int i = 0; i < 100; i++)
  5. {
  6. Console.WriteLine(".");
  7. Thread.Sleep(500);
  8. }
  9. /* 异步调用委托之:异步回调 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# 创建线程的简单方式:异步委托 .的更多相关文章

  1. java创建线程的多种方式

    java创建线程的四种方式 1.继承 Thread 类 通过继承 Thread 类,并重写它的 run 方法,我们就可以创建一个线程. 首先定义一个类来继承 Thread 类,重写 run 方法. 然 ...

  2. pthread创建线程的简单演示

      使用pthread创建子线程的简单步骤 导入头文件 #import <pthread.h> 指定新线程标识符 使用pthread创建线程的函数 根据result = 0 与否判断子线程 ...

  3. 创建线程的一般方式和匿名内部类方式对比——实现runnable接口,重新run方法

    启动:使用静态代理设计模式 优点:可同时实现继承,避免单继承局限性 一般方式: Programer.java /** * 真实角色 * * @author :liuqi * @date :2018-0 ...

  4. 创建线程的一般方式和匿名内部类方式对比——继承thread类,重写run()方法

    第一种:继承thread类,重写run()方法 一般方式:Demo01.java /** * 创建线程的第一种方式:继承thread类,重写run()方法 * * @author :liuqi * @ ...

  5. Java中创建线程主要有三种方式

    一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. (2)创建Thread子类的实 ...

  6. Java创建线程四种方式

    1.继承Thread类 public class MyThread extends Thread { public MyThread() { } public void run() { for(int ...

  7. 多线程-创建线程第二种方式-实现Runnable接口-细节和好处

    1 package multithread2; 2 3 /* 4 * 创建线程的第一种方法:继承Thread类 5 * 6 * 创建线程的第二种方式:实现Runnable接口 7 * 8 * 1,定义 ...

  8. Java并发编程原理与实战五:创建线程的多种方式

    一.继承Thread类 public class Demo1 extends Thread { public Demo1(String name) { super(name); } @Override ...

  9. java多线程 -- 创建线程的第三者方式 实现Callable接口

    Java 5.0 在 java.util.concurrent 提供了一个新的创建执行线程的方式:Callable 接口Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个 ...

随机推荐

  1. Cocos2d-x单机游戏防八门神器修改数据

    来源:http://cocos2d.9tech.cn/news/2014/0212/39812.html 网上的cocos2d-x教程多为知识点的讲解,但我们学习cocos2d-x的目的是为了什么?为 ...

  2. [原创]Devexpress XtraReports 系列 8 创建Drill-Through报表

    哎,今天公司工作忙了一天,一直没有时间写写东西.所以只能昨天晚上加班写咯.苦逼啊...... 昨天发表了Devexpress XtraReports系列第七篇[原创]Devexpress XtraRe ...

  3. HDU 3923 Invoker(polya定理+逆元)

    Invoker Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 122768/62768 K (Java/Others)Total Su ...

  4. poj 3264 Balanced Lineup(RMQ裸题)

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 43168   Accepted: 20276 ...

  5. windows XP系统内核文件分析(全)

    Windows XP个别 System32 文件 System32 文件夹下个别要移除的文件 我们就要删除另外600 个 system32 文件...我们要一次把它们全都解决掉. 以下是我所删除的 S ...

  6. Swift-CALayer十则示例

    作者:Scott Gardner   译者:TurtleFromMars原文:CALayer in iOS with Swift: 10 Examples 如你所知,我们在iOS应用中看到的都是视图( ...

  7. HDU2955Robberies(DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=2955 题目是说一小偷偷东西,第i个物品的价值是M[i],被抓的概率是p[i],现在要使得在被抓的概率在P以下时的 ...

  8. [网络]远程访问局域网svn服务器[转]

    转至:http://8474832.blog.51cto.com/8464832/1555449 打开路由器访问界面 选择转发规则->端口映射-新建 在弹出的界面中填写相应的端口号了内网ip 填 ...

  9. sql GROUP BY 分组统计

    语句1: SELECT TypeID, COUNT(*) AS [count] FROM GoodsInfo  GROUP BY TypeID 得到结果 解析结果:GoodsInfo表有 4条记录, ...

  10. Java异常处理中finally中的return会覆盖catch语句中的return语句

    Java异常处理中finally中的return会覆盖catch语句中的return语句和throw语句,所以Java不建议在finally中使用return语句 此外 finally中的throw语 ...