测试函数

static async Task RunProgram()
{
    var taskQueue = new ConcurrentQueue<CustomTask>();
    var cts = new CancellationTokenSource();
    //生成任务添加至并发队列
    var taskSource = Task.Run(() => TaskProducer(taskQueue));
    //同时启动四个任务处理队列中的任务
    Task[] processors = ];
    ;i <= ; i++)
    {
        string processId = i.ToString();
        processors[i - ] = Task.Run(
            () => TaskProcessor(taskQueue, "Processor " + processId, cts.Token)
            );
    }
    await taskSource;
    //向任务发送取消信号
    cts.CancelAfter(TimeSpan.FromSeconds());
    await Task.WhenAll(processors);
}

产生任务

static async Task TaskProducer(ConcurrentQueue<CustomTask> queue)
{
    ;i < ; i++)
    {
        );
        var workItem = new CustomTask { Id = i };
        queue.Enqueue(workItem);
        Console.WriteLine("task {0} has been posted", workItem.Id);
    }
}

执行任务

static async Task TaskProcessor(ConcurrentQueue<CustomTask> queue, string name, CancellationToken token)
{
    CustomTask workItem;
    bool dequeueSuccesful = false;
    await GetRandomDelay();
    do
    {
        dequeueSuccesful = queue.TryDequeue(out workItem);
        if (dequeueSuccesful)
        {
            Console.WriteLine("task {0} has been processed by {1}", workItem.Id, name);
        }
        await GetRandomDelay();
    }
    while (!token.IsCancellationRequested);
}
static Task GetRandomDelay()
{
    );
    return Task.Delay(delay);
}
class CustomTask
{
    public int Id { get; set; }
}
static void Main(string[] args)
{
    Task t = RunProgram();
    t.Wait();
    Console.ReadKey();
}

https://blog.csdn.net/conquerwave/article/details/50830648

C# 并发队列ConcurrentQueue的更多相关文章

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

    决定从这篇文章开始,开一个读源码系列,不限制平台语言或工具,任何自己感兴趣的都会写.前几天碰到一个小问题又读了一遍ConcurrentQueue的源码,那就拿C#中比较常用的并发队列Concurren ...

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

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

  3. C# 同步/并发队列ConcurrentQueue

    如下所示,ConcurrentQueue做到了代码的简化,在并发模型中充当同步对象 private ConcurrentQueue<string> inQueue = new Concur ...

  4. C# 同步/并发队列ConcurrentQueue (表示线程安全的先进先出 (FIFO) 集合)

    http://msdn.microsoft.com/zh-cn/library/dd267265(v=vs.110).aspx static void Main(string[] args) { // ...

  5. 阻塞队列LinkedBlockingQueue和并发队列ConcurrentLinkedQueue

    LinkedBlockingQueue: public class LinkedBlockingQueue<E> extends AbstractQueue<E> implem ...

  6. 基于无锁的C#并发队列实现(转载)

    最近开始学习无锁编程,和传统的基于Lock的算法相比,无锁编程具有其独特的优点,Angel Lucifer的关于无锁编程一文对此有详细的描述. 无锁编程的目标是在不使用Lock的前提下保证并发过程中共 ...

  7. 刀哥多线程之并发队列gcd-05-dispatch_queue_concurrent

    并发队列 特点 以先进先出的方式,并发调度队列中的任务执行 如果当前调度的任务是同步执行的,会等待任务执行完成后,再调度后续的任务 如果当前调度的任务是异步执行的,同时底层线程池有可用的线程资源,会再 ...

  8. ios多线程操作(五)—— GCD串行队列与并发队列

          GCD的队列能够分为2大类型,分别为串行队列和并发队列      串行队列(Serial Dispatch Queue):      一次仅仅调度一个任务,队列中的任务一个接着一个地运行( ...

  9. iOS 之GCD串行和并发队列的理解

    dispatch_queue_t serialQueue = dispatch_queue_create("com.lai.www", DISPATCH_QUEUE_SERIAL) ...

随机推荐

  1. 常见的http response

    200            //OK                                 400            //bad request 401           //Una ...

  2. java 对象直接序列化

    序列化类,加字段后, 使用该类从现有文件反序列化时,以前字段可以正常读出 但是反序列化后,那些未对应字段会被设置成null ,即使在类的定义种已设置了初始值 --------------------- ...

  3. nodename nor servname provided, or not known

    mac来使用redis然后产生上述错误,据说是用户名的问题 解决: 打开终端: cat /private/etc/hosts sudo vi /private/etc/hosts 将错误的那个名字加入 ...

  4. 前端福利之HTML5 UTF-8 中文乱码(转)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. Redis安装系统服务1073错误

    报错:D:\ProgramFiles\redis>redis-server.exe --service-install redis.windows.conf --loglevel verbose ...

  6. 20155308 2016-2017-2 《Java程序设计》第8周学习总结

    20155308 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 第十四章 NIO与NIO2 NIO(New IO)-from JDK1.4 NIO2 -fr ...

  7. http://blog.csdn.net/hongchangfirst/article/details/26004335

    悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁.传统的 关系型数 ...

  8. 组队作业_One

    Part 1.前言 结对项目作业 结对同学高裕翔的博客 本博文pdf版本 Part 2.PSP表 PSP3.1 Personal Software Process Stages 预估耗时(分钟) 实际 ...

  9. [转]解决Mysql InnoDB: Failing assertion: ret || !assert_on_error问题

    国庆回来后,发现mysql停止服务了,没办法继续启动了.查看日志,看到: 131008 09:56:03 mysqld_safe Starting mysqld daemon with databas ...

  10. [Erlang21]Erlang性能分析工具eprof fporf的应用

    前段时间项目改代码突然cpu波动很大,排查了好久都没有找到原因,只能求助于性能测试工具 :   <<Erlang程序设计>>----Joe Armstorng[哈哈,登月第一人 ...