编写代码的过程中经常会遇到需要并行操作的时候,此时就需要使用到多线程操作,.net中提供了多种操作多线程的方法,这里介绍最简单的一种----通过ThreadPool.QueueUserWorkItem。

首先看实例代码

ThreadPool.QueueUserWorkItem(DoSomeThing);private void DoSomeThing(object state){for (int i = 0; i < int.MaxValue; i++){for (int j = 0; j < int.MaxValue; j++){if (j == int.MaxValue - 1){i++;}}}}

其实灰常简单,上面定义了一个测试方法DoSomeThing用于模拟耗时操作,忧郁的表示正常情况应该不会有人会写出这样的方法,当需要异步调用DoSomeThing时,只需要通过调用QueueUserWorkItem 方法,并将DoSomeThing作为回调函数传入,即可异步调用DoSomeThing方法,此时线程池中的某一个线程将会调用DoSomeThing方法。

接着,介绍一下异步操作的取消,即在异步操作的执行过程中,强制停止函数的执行

修改一下上面的DoSomeThing方法如下

private void <span style="font-family: Arial, Helvetica, sans-serif;">DoSomeThing</span>(CancellationToken token, object state){for (int i = 0; i < int.MaxValue; i++){for (int j = 0; j < int.MaxValue; j++){if (token.IsCancellationRequested){break;}<pre name="code" class="csharp"><span style="white-space:pre">           </span>if (j == int.MaxValue - 1){i++;}

} if (token.IsCancellationRequested) { break; } } }

这次的DoSomeThing方法多了一个CancellationToken类型的参数,通过它可以实时探测到方法是否被取消,其使用方法如下:

首先,新建一个CancellationTokenSource对象

 CancellationTokenSource cancelSource = new CancellationTokenSource();

之后将CancellationTokenSource对象的token通过回调方法传入

ThreadPool.QueueUserWorkItem((o) => { DoSomeThing(cancelSource.Token, o); });

因为QueueUserWorkItem的回调函数要求只有一个参数,此处使用了lambda构建了一个含有一个参数的匿名函数,并将cancelSource.Token 传入,就这样,我们新建了一个可取消的异步操作。

当我们需要将异步操作中断时,我们只需要调用一下CancellationTokenSource的cancel方法即可,如下:

cancelSource.Cancel();

在这里CancellationTokenSource的作用其实相当于一个全局状态变量,如果仅仅只是为了实现任务的中断,完全可以使用全局变量来取代,我们可以再次改写DoSomeThing函数如下:

 int statenum=0;
private void DoSomeThing(object state){for (int i = 0; i < int.MaxValue; i++){for (int j = 0; j < int.MaxValue; j++){if (statenum == 1){break;}if (j == int.MaxValue - 1){i++;}}if (statenum == 1){break;}}}

此时,如果在耗时操作执行过程中将statenum变量置成1,也可实现中断的效果,当然,CancellationTokenSource还有其他的功能,这里就不做深入的探讨了,详情可查阅msdn

c#多线程之QueueUserWorkItem相关推荐

  1. 稳扎稳打Silverlight(25) - 2.0线程之Thread, Timer, BackgroundWorker, ThreadPool

    [索引页] [源码下载] 稳扎稳打Silverlight(25) - 2.0线程之Thread, Timer, BackgroundWorker, ThreadPool 作者:webabcd 介绍 S ...

  2. 异步多线程之ThreadPool详解

    上一篇:异步多线程之Thread 下一篇:异步多线程之入Task 介绍 ThreadPool 是 .net 2.0 时代的产物,有了 Thread 为什么还会有 ThreadPool 呢?Thread ...

  3. Android多线程之ArrayBlockingQueue源码解析

    阻塞队列系列 Android多线程之LinkedBlockingQueue源码解析 Android多线程之SynchronousQueue源码解析 Andorid多线程之DelayQueue源码分析 ...

  4. Asp.Net Core 轻松学-多线程之Task快速上手

    Asp.Net Core 轻松学-多线程之Task快速上手 原文:Asp.Net Core 轻松学-多线程之Task快速上手 前言     Task是从 .NET Framework 4 开始引入的一 ...

  5. JAVA多线程之wait/notify

    本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...

  6. linux 线程pthread_detach,linux线程之pthread_join和pthread_detach

    在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死.在 被其他线程回收之前,它的存储器资源(例如栈)是不释放的.相反 ...

  7. Java多线程之Callable、Future和FutureTask

    Java多线程之Callable接口 自己想总结一下的,看到一篇总结的更好的博客,就转载了,突然感觉真轻松,哈哈哈哈 文章转载于:Matrix海子:Java并发编程:Callable.Future和F ...

  8. Java多线程之Synchronized和Lock的区别

    Java多线程之Synchronized和Lock的区别 目录: 原始构成 使用方法 等待是否可以中断 加锁是否公平 锁绑定多个条件Condition 小结:Lock相比较Synchronized的优 ...

  9. Java多线程之CAS缺点

    Java多线程之CAS缺点 目录: 循环时间开销很大 只能保证一个共享变量的原子操作 引来ABA问题及解决方案(重点) 1. 循环时间开销很大 通过看源码,我们发现有个do while,如果CAS失败 ...

最新文章

  1. http://www.cnblogs.com/youfan/articles/3216816.html
  2. Linux Shell 脚本限制ssh最大用户登录数
  3. HTTP协议是无状态协议,怎么理解?
  4. 以太坊Ethereum存储和数据结构 图示
  5. PCB设计要点-DDR3布局布线技巧及注意事项
  6. 汉川一中2021高考成绩查询,2021年汉川市高考状元名单资料,今年汉川市高考状元多少分...
  7. intellij 快捷键
  8. mysql8安装错误_Windows安装MySQL8.0.16 的步骤及出现错误问题解决方法
  9. JS读取id和name的操作
  10. 日本第一赘婿!他入赘近20年拿下诺贝尔奖,成名后不忘教光棍讨老婆......
  11. dfs剪枝:洛谷P2809 hzwer爱折纸
  12. 【云栖计算之旅】线下沙龙第2期精彩预告:Docker在云平台上的最佳实践
  13. 接收二进制数据_详解前端websocket原理之数据传输协议
  14. 在Ubuntu16.04下安装cmake 和cmake-gui
  15. 2017-07-12 周三 今日总结
  16. 匿名内部类为什么访问外部类局部变量必须是final的?
  17. Ubuntu安装兄弟打印机驱动
  18. bugku never_give_up file_get_contents()有php://input漏洞 eregi \x00绕过
  19. 简单的微信使用技巧,你需要掌握的技巧
  20. 在GNU/Linux下将CD音乐转为mp3

热门文章

  1. 第一章 虚拟现实技术概论
  2. java模拟UNO玩家对战
  3. 解密碧生源:消费者买的到底是茶,还是被收购了智商税?
  4. Vue前端资源本地下载(即文件放在前端目录下)
  5. C++实现ping功能
  6. python斐波那契数列for循环_Python编程题、for循环和列表推导式的用法题(阿凡提与国王比赛下棋、 斐波那契数列等)...
  7. 【SVM分类】基于自适应蚁狮算法优化SVM分类器实现胃肠道病变附matlab代码
  8. 无符号 byte java_java byte的无符号表示
  9. 基于Anaconda的matplotlib学习
  10. 华为章宇:如何学习开源项目及Ceph的浅析