博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
生产消费者队列(TaskCompletionSource)的应用
阅读量:6964 次
发布时间:2019-06-27

本文共 3349 字,大约阅读时间需要 11 分钟。

using System;using System.Collections.Concurrent;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;using System.Threading.Tasks;namespace ConsoleApplication6{    public class PCQueue : IDisposable    {        class WorkItem        {            public readonly TaskCompletionSource TaskSource;            public readonly Action Action;            public readonly CancellationToken? CancelToken;            public WorkItem(              TaskCompletionSource taskSource,              Action action,              CancellationToken? cancelToken)            {                                TaskSource = taskSource;                Action = action;                CancelToken = cancelToken;            }        }        BlockingCollection
_taskQ = new BlockingCollection
(); ///
/// 为每个消费者创建并启动单独的任务: 这里我启动了2个任务,用于打印easy和easy2这两个的顺序不一定 /// ///
public PCQueue(int workerCount) { // 为每个消费者创建并启动单独的任务: for (int i = 0; i < workerCount; i++) Task.Factory.StartNew(Consume); } public void Dispose() { _taskQ.CompleteAdding(); } ///
/// 默认任务取消标识为null的任务进队方法 /// ///
///
public Task EnqueueTask(Action action) { return EnqueueTask(action, null); } ///
/// 任务进队方法含标识 /// ///
///
///
public Task EnqueueTask(Action action, CancellationToken? cancelToken) { var tcs = new TaskCompletionSource
(); _taskQ.Add(new WorkItem(tcs, action, cancelToken)); //通过TaskCompletionSource返回任务本身,可查看任务的响应信息如result,exception,status等等 return tcs.Task; } void Consume() { foreach (WorkItem workItem in _taskQ.GetConsumingEnumerable()) if (workItem.CancelToken.HasValue && workItem.CancelToken.Value.IsCancellationRequested) { workItem.TaskSource.SetCanceled(); } else try { workItem.Action(); workItem.TaskSource.SetResult(1234); // 表示完成 } catch (OperationCanceledException ex) { if (ex.CancellationToken == workItem.CancelToken) workItem.TaskSource.SetCanceled(); else workItem.TaskSource.SetException(ex); } catch (Exception ex) { workItem.TaskSource.SetException(ex); } } } class Program { static void Main(string[] args) { CancellationToken token1 = new CancellationToken(true); // var pcQ = new PCQueue(2); Task task = pcQ.EnqueueTask(() => Console.WriteLine("Easy!"),token1);//输出easy的任务不会执行 task = pcQ.EnqueueTask(() => Console.WriteLine("Easy2!"));//会执行 // ... Console.Read(); } }}

 

转载于:https://www.cnblogs.com/kexb/p/6793154.html

你可能感兴趣的文章
Velocity魔法堂系列二:VTL语法详解
查看>>
正则表达式
查看>>
现行技术体系的问题总结
查看>>
fibonacci 数列及其应用
查看>>
Win7 SP1语言包微软官方下载地址及使用方法 2
查看>>
C++ Error: no appropriate default constructor available
查看>>
Ubuntu Linux系统下apt-get命令详解
查看>>
javaWeb学习总结(4)- HttpServletResponse
查看>>
轻量级UML工具-UMLet
查看>>
【读书笔记《Android游戏编程之从零开始》】17.游戏开发基础(游戏适屏的简述和作用、让游戏主角动起来)...
查看>>
.NET 中关于 TypeCode 和枚举类型的问题
查看>>
cidaemon.exe进程cpu占用率高及关闭cidaemon.exe进程方法
查看>>
CheckBoxPreference组件
查看>>
C语言指针的初始化和赋值
查看>>
opencv第二课 进行缩放图片~
查看>>
sql server 导出数据到 Azure Hbase / Hive 详细步骤
查看>>
Jconsole远程监控tomcat 的JVM内存(linux、windows)
查看>>
Core Animation简介
查看>>
hdu 2251 Dungeon Master bfs
查看>>
Material Design系列第五篇——Working with Drawables
查看>>