.net NET中多线程任务队列的实现

.net NET中多线程任务队列的实现,.net,multithreading,.net,Multithreading,我最头疼的是,我的服务器应用程序在负载下超过了最大的开放数据库连接数。所以,我想我需要一个任务队列(又名服务总线)来进行写数据库访问。一个队列,db写请求可以发布到该队列,专用线程将读取并执行该队列 我想知道是否有现成的组件可以做到这一点。我的要求是: 多个线程可以以最小的阻塞写入队列 可以从队列中读取多个线程以执行已发布的写请求。在最受限制的情况下,这个数字是1,但可能更多,例如,开放数据库连接限制的10% 有什么想法吗 谢谢 附言 我已经注意到了,但这两个似乎都与我无关。.NET4.0提供了

我最头疼的是,我的服务器应用程序在负载下超过了最大的开放数据库连接数。所以,我想我需要一个任务队列(又名服务总线)来进行写数据库访问。一个队列,db写请求可以发布到该队列,专用线程将读取并执行该队列

我想知道是否有现成的组件可以做到这一点。我的要求是:

  • 多个线程可以以最小的阻塞写入队列
  • 可以从队列中读取多个线程以执行已发布的写请求。在最受限制的情况下,这个数字是1,但可能更多,例如,开放数据库连接限制的10%
  • 有什么想法吗

    谢谢

    附言


    我已经注意到了,但这两个似乎都与我无关。

    .NET4.0提供了几种线程安全的数据结构。
    应该是你想要的


    它缺少一个阻塞出列或一个事件信号,表明某个东西已经入列。因此,如果需要,您需要自己实现这样一个信号。

    在.NET 4的过程中,您的起点几乎肯定应该是:

  • ,或
  • 使用并行LINQ方法,比如使用set传递实例

  • 使用实现生产者/消费者模式的
    BlockingCollection
    。它是线程安全的,因此您可以同时从多个线程访问它。下面是一个如何使用的示例:

    var collection = new BlockingCollection<MyClass>();
    
    // start a new background task to fill the queue
    Task.Factory.StartNew(() => {
        while(thereIsStillStuffToStoreInTheDatabase)
        {
            var item = GetNextItem();
            collection.Add(item);
        }
        collection.CompleteAdding();
    });
    
    // GetConsumingEnumerable() blocks while empty until the producer
    // has more items or it signals that adding is complete
    foreach(var item in collection.GetConsumingEnumerable())
    {
        // store item in database
    }
    
    var collection=newblockingcollection();
    //启动新的后台任务以填充队列
    Task.Factory.StartNew(()=>{
    while(存储在数据库中的文件)
    {
    var item=GetNextItem();
    集合。添加(项目);
    }
    collection.CompleteAdding();
    });
    //GetConsumingEnumerable()在空时阻塞,直到生产者
    //有更多项目,或表示添加已完成
    foreach(collection.GetConsumingEnumerable()中的var项)
    {
    //在数据库中存储项
    }
    
    请注意,上述实现也可以反向执行,后台
    任务
    从集合中消耗,主工作线程填充它


    约瑟夫·阿尔巴哈里(Joseph Albahari)在任务和并行性方面有着出色的著作。您可以阅读所有关于它的信息,特别是关于BlockingCollection的信息。

    不,不要自己执行信号发送。看看同一名称空间中的BlockingCollection。只是为了链接到Albahari站点,你应该得到+1。