tnblog
首页
视频
资源
登录

异步线程,轮询的demo

6334人阅读 2018/12/19 14:35 总访问:150199 评论:0 收藏:0 手机
分类: C#

        创建一个控制台应用程序,代码如下:

    1. using System;
    2. using System.Threading;
    3. namespace ConsoleApplication1
    4. {
    5. public delegate string AsyncDelegate(int callDuration, out int threadId);
    6. class Program
    7. {
    8. static void Main(string[] args)
    9. {
    10. //Fun1();
    11. //Fun2();
    12. //Fun3();
    13. Fun4();
    14. Console.ReadLine();
    15. }
    16. private static int threadId;
    17. //阻塞等待   使用 EndInvoke 等待异步调用  
    18. static void Fun1()
    19. {
    20. //创建示例类的实例。
    21. AsyncDemo ad = new AsyncDemo();
    22. // 创建委托
    23. AsyncDelegate dlgt = new AsyncDelegate(ad.TestMethod);
    24. // 委托在这里开始异步调用。
    25. IAsyncResult ar = dlgt.BeginInvoke(5000,out threadId, nullnull);
    26. //人为的线程阻塞。
    27. Thread.Sleep(0);
    28. //Thread.CurrentThread.Name = "主线程";
    29. Console.WriteLine("主线程 {0}开始工作",Thread.CurrentThread.ManagedThreadId);
    30. // 委托开始EndInvoke调用,这个过程会使主线程等待异步调用完成并返回结果。
    31. string ret = dlgt.EndInvoke(out threadId, ar);
    32. Console.WriteLine("使用 EndInvoke 等待异步调用!!!");
    33. Console.WriteLine("异步线程 {0},返回值 \"{1}\".", threadId, ret);
    34. Console.WriteLine("主线程{0}结束工作", Thread.CurrentThread.ManagedThreadId);
    35. }
    36. //阻塞等待  使用 WaitHandle 等待异步调用
    37. static void Fun2()
    38. {
    39. AsyncDemo ad = new AsyncDemo();
    40. AsyncDelegate dlgt = new AsyncDelegate(ad.TestMethod);
    41. IAsyncResult ar = dlgt.BeginInvoke(5000,out threadId, nullnull);
    42. Thread.Sleep(0);
    43. Console.WriteLine("主线程 {0}开始工作", Thread.CurrentThread.ManagedThreadId);
    44. //主线程在这里等待,直到异步线程执行完。
    45. ar.AsyncWaitHandle.WaitOne();
    46. // 和前一方案的区别在于,你可以在异步调用完成后,获取异步调用返回值之前
    47. //在这里做点任何你想作的事。
    48. //调用EndInvoke获取异步调用的返回结果.
    49. string ret = dlgt.EndInvoke(out threadId, ar);
    50. Console.WriteLine("使用 WaitHandle 等待异步调用!!!");
    51. Console.WriteLine("异步线程 {0},返回值 \"{1}\".", threadId, ret);
    52. Console.WriteLine("主线程{0}结束工作", Thread.CurrentThread.ManagedThreadId);
    53. }
    54. //轮询状态    轮询异步调用完成
    55. static void Fun3()
    56. {
    57. AsyncDemo ad = new AsyncDemo();
    58. AsyncDelegate dlgt = new AsyncDelegate(ad.TestMethod);
    59. IAsyncResult ar = dlgt.BeginInvoke(5000,out threadId, nullnull);
    60. Console.WriteLine("使用轮询异步调用!!!");
    61. Console.WriteLine("主线程 {0}开始工作", Thread.CurrentThread.ManagedThreadId);
    62. //这里每隔10毫秒就检测(轮询)一下异步执行的状态,
    63. //直到异步调用完成,IsCompleted的值变为ture为止。
    64. int count = 0;
    65. DateTime a = DateTime.Now;
    66. while (ar.IsCompleted == false)
    67. {
    68. Thread.Sleep(10);
    69. count++;
    70. }
    71. string dt = (DateTime.Now - a).ToString();
    72. Console.WriteLine(count);
    73. Console.WriteLine("程序耗时"+dt);
    74. //还记得微软的那个善意的提醒吗?虽然IsCompleted为true了,
    75. //我们还是调用一下EndInvoke,来获取返回值。
    76. string ret = dlgt.EndInvoke(out threadId, ar);
    77. Console.WriteLine("异步线程 {0},返回值 \"{1}\".", threadId, ret);
    78. Console.WriteLine("主线程{0}结束工作", Thread.CurrentThread.ManagedThreadId);
    79. }
    80. //通知机制    异步调用完成时执行回调方法
    81. static void Fun4()
    82. {
    83. AsyncDemo ad = new AsyncDemo();
    84. AsyncDelegate dlgt = new AsyncDelegate(ad.TestMethod);
    85. //注意第三个参数,这就是我们要用到的回调方法。
    86. //第四个参数更为有趣,它可以是任何Object对象,这里它就是
    87. //执行异步调用的委托本身,把委托本身传递进去的原因在下面可以看到。
    88. Console.WriteLine("异步调用完成时执行回调!!!");
    89. Console.WriteLine("主线程 {0}开始工作", Thread.CurrentThread.ManagedThreadId);
    90. IAsyncResult ar = dlgt.BeginInvoke(5000,out threadId, new AsyncCallback(CallbackMethod), dlgt);
    91. Console.WriteLine("主线程 {0}结束工作", Thread.CurrentThread.ManagedThreadId);
    92. Console.ReadLine();
    93. }
    94. //回调函数必须严格的遵照AsyncCallback委托的签名。
    95. static void CallbackMethod(IAsyncResult ar)
    96. {
    97. //在这里,上面那个dlgt作为参数的作用得到了体现,原来它就是为了完成对EndInvoke的调用啊。
    98. AsyncDelegate dlgt = (AsyncDelegate)ar.AsyncState;
    99. //通过对EndInvoke的调用获取返回值。
    100. string ret = dlgt.EndInvoke(out threadId, ar);
    101. Console.WriteLine("异步线程 {0},返回值 \"{1}\".", threadId, ret);
    102. }
    103. }
    104. //使用异步编程模型 
    105. public class AsyncDemo
    106. {
    107. public string TestMethod(int callDuration, out int threadId)
    108. {
    109. Console.WriteLine("异步方法开始工作");
    110. Thread.Sleep(callDuration);
    111. //Thread.CurrentThread.Name = "异步线程";
    112. threadId = Thread.CurrentThread.ManagedThreadId;
    113. return "异步方法执行时间 " + callDuration.ToString();
    114. }
    115. }
    116. }

        代码比较简单了,看不懂 多调休跑几遍就懂了!

评价

golang 简单的workpool demo

// 实现计算一个数字的各个位数之和如:123=6 // 采用工作池方式 package main import ( "fmt" &...

C 使用CancellationTokenSource取消多线程

有时间我们在使用多线程的时候,需要取消线程的执行,可以使用CancellationTokenSource来取消对Task开辟多线程的取消如下:...

线程、Lock锁、数据库实现队列

队列其元素以先进先出(Firstin,Firstout,FIFO)的方式来处理的集合。先放入队列中的元素会先读取。队列使用System.Collect...

线程异步编程与消息队列区别想法

开线程也是异步,消息队列也是异步为什么还要用消息队列?因为开线程始终是在一个项目中,处理也需要这个项目或者这台电脑...

等待所有线程执行完后,在执行某个方法

彼年豆蔻,谁许谁地老天荒。在多线程环境下,我们可能会需要等待开辟的线程执行完后,再去执行某个方法,例如输出并行计算...

线程的使用方法

首先引用线程的命名空间using System.Threading;实例化线程把逻辑代码放进去使用该属性必须用async进行修饰线程回调首先在...

c list的线程安全性

看看msdn上关于list线程安全的解释:此类型的公共静态(SharedVisual Basic)成员是线程安全的。但不保证所有实例成员都是...

Linux axel 多线程下载

Linux axel 多线程下载[TOC] 下载wget http://www.ha97.com/code/axel-2.4.tar.gz # 二选一 wget https://files.cnblogs...

线程池的好处

线程池,使用了池化思想来管理线程,池化技术就是为了最大化效益,最小化用户风险,将资源统一放在一起管理的思想。这种思...

servlet 线程安全问题 5

线程安全问题一、创建Javaweb项目。。。。。二、创建类1、继承抽象类,重写方法2、doGet的具体逻辑三、在web.xml的配置四、...

core 异步多线程

前言同步异步编程同步编程是对于单线程来说的,就像我们编写的控制台程序,以main方法为入口,顺序执行我们编写的代码。异...

JAVA多线程系列--ForkJoinPool详解

https://blog.csdn.net/niyuelin1990/article/details/78658251https://blog.csdn.net/dhaibo1986/article/details/1087373...

.NET 6 多线程

参考这篇文章:.NET 6 多线程的几种打开方式https://mp.weixin.qq.com/s?__biz=MzA3MDMyMzk0NA==&mid=2650832187&...

.net多线程 并行执行Parallel,列表遍历,循环下的并行执行

Parallel允许线程并行执行。同时支持最大线程执行数量设置,可以设置最大并发数量。 [TOC]基础用法static void Main(strin...

C 使用异步方法async awaittask

实现一个简单的异步方法[HttpPost("{id}")] publicTask<string>Post(intid) { returnTask<string&gt...
Decorating heart
排名
10
文章
102
粉丝
17
评论
34
腾讯防水墙
赖成龙 : 学长你有下载好的js文件吗
使用 JSON WEB TOKEN (jwt) 验证
饰心 : 由于最近换了新的工作环境,还在挖煤中。后续会增加博客更新频率。
腾讯防水墙
饰心 : @剑轩,快去给tnblog弄一个
使用select2实现下拉框中显示图片
剑轩 : 秀啊.....,飞常不错
使用select2实现下拉框中显示图片
饰心 : 嗯~刚好差不多下班
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术
世事变幻无常,而近乎永恒不变者,唯你我头上的同一片星空。