本文讲述实现抽象出来的异步通知回调进度通知,用在多层组件中,支持一组task的任意进度回调通知。本文中用到几个.NET 4.0的新方法和TPL方法:Tuple,ConcurrentQueue,SemaphoreSlim,Task...说明:如果你是一个简单的Task可能无需这么复杂,用传入Action同步回调即可,但是注意NotifyProgress也就是在任务执行过程中随时同步通知进度,会造成你任务阻塞。如果你是在UI层,用BackgroundWorkder最简单了。(本文原创于http://mainz.cnblogs.com,转载请注明。)

   //异步操作,代替Thread, threadPoolTask _ProgressQueueTask = null;//限制并发访问资源的线程数,SemaphoreSlim开销低于Semaphore50倍SemaphoreSlim _ProgressCounter = null;//并发队列ConcurrentQueue,线程安全的队列//Tuple:元数据结构,可以方便的访问其itemConcurrentQueue<tuple<progressaction, string,="" int?="">> _ProgressQueue = new ConcurrentQueue<tuple<progressaction, string,="" int?="">>();Action<progressaction, string,="" int?=""> _OnProgress;public Action<progressaction, string,="" int?=""> OnProgress{get {  return _OnProgress; }set{_OnProgress = value;if (_ProgressQueueTask == null){_ProgressQueueTask = new Task(() =>{while (true){Tuple<progressaction, string,="" int?=""> item;//查询队列if (_ProgressQueue.TryDequeue(out item)){OnProgress(item.Item1, item.Item2, item.Item3);}else{//线程等待信号,由NotifyProgress入队列并给予信号_ProgressCounter.Wait();}}},TaskCreationOptions.LongRunning);_ProgressCounter = new SemaphoreSlim(0, 10);//初始0,最大限制10_ProgressQueueTask.Start();}}}//在任何Task的执行过程中,或一组task的执行过程中,可以调用此方法来异步回调随时通知进度,而不会阻塞本任务public void NotifyProgress(ProgressAction action, string item = null, long? current = null, long? maxCount = null){if (OnProgress != null){int? percent = null;if (current.HasValue && maxCount.HasValue){percent = (int)((double)current.Value / (double)maxCount.Value * 100.0);}_ProgressQueue.Enqueue(Tuple.Create(action, item, percent));_ProgressCounter.Release();}return;}public enum ProgressAction{Adding,Extracting,Extracted,Validating,Validated,Deleting,Deleted,Restore};//用法://中间层NotifyProgress(ProgressAction.Extracting, "abc");//界面层OnProgress = (action, file, percent) =>{  //...}

有问题请回复。本文结束,代码带注释。

转载于:https://www.cnblogs.com/Mainz/archive/2011/10/13/2209924.html

用并发队列(ConcurrentQueue)实现多线程任务中随时异步回调进度通知(.Net4.0)相关推荐

  1. [一起读源码]走进C#并发队列ConcurrentQueue的内部世界 — .NET Core篇

    在上一篇<走进C#并发队列ConcurrentQueue的内部世界>中解析了Framework下的ConcurrentQueue实现原理,经过抛砖引玉,得到了一众大佬的指点,找到了.NET ...

  2. 转:在 .NET 中实现异步回调访问数据库

    在 .NET 中实现异步回调访问数据库 时间:2009-11-17 19:52来源:网络收集 作者:佚名 点击: 334 次 技术论坛 某些场合下,在对数据库进行访问时,为了避免同步访问数据时所带来的 ...

  3. java 中的异步回调

    异步回调,本来在c#中是一件极为简单和优雅的事情,想不到在java的世界里,却如此烦琐,先看下类图: 先定义了一个CallBackTask,做为外层的面子工程,其主要工作为start 开始一个异步操作 ...

  4. 并发危险:解决多线程代码中的 11 个常见的问题

    本文将介绍以下内容: 基本并发概念 并发问题和抑制措施 实现安全性的模式 横切概念 本文使用了以下技术:  多线程..NET Framework 目录 数据争用  忘记同步  粒度错误  读写撕裂  ...

  5. [译]预留位置队列PRQueue:多线程程序中消息输入队列和消息输出队列保持同序...

    译自: http://accu.org/var/uploads/journals/overload101.pdf 在多线程应用程序中,要求消息输入队列和消息输出队列顺序要求保持一致,而忽略多线程并发处 ...

  6. 多线程是并行还是并发_并发,并行,线程,进程,异步和同步有相关性吗?

    本文翻译自:https://medium.com/swift-india/concurrency-parallelism-threads-processes-async-and-sync-relate ...

  7. ES6中的异步对象Promise

    回忆一下ES5中的怎么使用异步方法 // es5中的异步回调let ajax = function(callback){console.log('执行') // 执行setTimeout(() =&g ...

  8. pages validateRequest=false/在.net4.0中无效的问题

    再web.config中设置<pages validateRequest="false"/>在.net4.0中无效的问题 解决方案: <system.web> ...

  9. 多线程编程:阻塞、并发队列的使用总结

    最近,一直在跟设计的任务调度模块周旋,目前终于完成了第一阶段的调试.今天,我想借助博客园平台把最近在设计过程中,使用队列和集合的一些基础知识给大家总结一下,方便大家以后直接copy.本文都是一些没有技 ...

  10. 聊聊Java中的并发队列中 有界队列和无界队列的区别

    转载自 https://blog.csdn.net/AJ1101/article/details/81711812 本文主要总体的说一说各种并发队列  首先来一张全体照  从有界无界上分  常见的有界 ...

最新文章

  1. nginx进程管理之master进程
  2. File System Filter Driver Tutorial
  3. 心系农业心系农民-农民丰收节·林裕豪:企业在实践当中参与
  4. 如何使用 controllerExtensions 给 SAP Fiori Elements List Report 的表格注册事件响应函数
  5. 巧用定时任务监控第三方组件是否正常
  6. Eclipse项目左上角出现大红色感叹号怎么办?
  7. java打印的globa类l_Spring异常集中处理和日志集中打印
  8. 微信企业号让IOS不要识别数字为电话号码的方法
  9. 好奇心、求知欲、理解力一直是我生命里最强大的驱动力​
  10. Linux系统安装MySql步骤及截屏
  11. [Java] 蓝桥杯ADV-83 算法提高 寻找三位数
  12. python 抢票_亲测,python抢票成功!
  13. Comware V7系统设备,密码+秘钥双因子认证方式,登陆设备典型配置案例
  14. 计算机预测自己未来的相貌,测测未来另一半的模样 测测你的另一半长相软件...
  15. linux 限速命令,linux上传限速脚本介绍
  16. 对于Linux内核tty设备的一点理解 【转】
  17. 十八、DPM模型案例(二)
  18. java 微信请求超时_java – SQL服务器“超出锁定请求超时时间”..再次
  19. 【图床】图床、PicGo进行图片管理与上传
  20. windows系统无法保存文件的解决方案

热门文章

  1. linux 设置自动定时清理日志
  2. JS去除数组中重复的值(四种方法)
  3. 文件大小图形化软件 SpaceSniffer(转载)
  4. JSP的执行过程及生命周期
  5. python如何使用 b_python中的b
  6. 添加类别html页面,WordPress分类/标签/页面的url链接添加html后缀
  7. eclipse找不到arm-linux-gcc,使用 Eclipse 和 ARM GCC 搭建 STM32 开发环境
  8. css两张图片怎么合在一起_PhotoShop怎么把两张图片合成一张?怎么用ps把两张图片合成一张?...
  9. SQL:postgresql中实现查询某字段总数量和该字段不同值各自的数量
  10. mysql505复位密码_MySQL数据库复位根用户的密码_MySQL