.net NET中多线程任务队列的实现
我最头疼的是,我的服务器应用程序在负载下超过了最大的开放数据库连接数。所以,我想我需要一个任务队列(又名服务总线)来进行写数据库访问。一个队列,db写请求可以发布到该队列,专用线程将读取并执行该队列 我想知道是否有现成的组件可以做到这一点。我的要求是:.net NET中多线程任务队列的实现,.net,multithreading,.net,Multithreading,我最头疼的是,我的服务器应用程序在负载下超过了最大的开放数据库连接数。所以,我想我需要一个任务队列(又名服务总线)来进行写数据库访问。一个队列,db写请求可以发布到该队列,专用线程将读取并执行该队列 我想知道是否有现成的组件可以做到这一点。我的要求是: 多个线程可以以最小的阻塞写入队列 可以从队列中读取多个线程以执行已发布的写请求。在最受限制的情况下,这个数字是1,但可能更多,例如,开放数据库连接限制的10% 有什么想法吗 谢谢 附言 我已经注意到了,但这两个似乎都与我无关。.NET4.0提供了
我已经注意到了,但这两个似乎都与我无关。.NET4.0提供了几种线程安全的数据结构。
应该是你想要的
它缺少一个阻塞出列或一个事件信号,表明某个东西已经入列。因此,如果需要,您需要自己实现这样一个信号。在.NET 4的过程中,您的起点几乎肯定应该是:
使用实现生产者/消费者模式的
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。