Tag: 并发集合

ConcurrentBag – 添加多个项目?

有没有办法一次向ConcurrentBag添加多个项目,而不是一次添加一个? 我没有在ConcurrentBag上看到AddRange()方法,但是有一个Concat()。 但是,这对我不起作用: ConcurrentBag objectList = new ConcurrentBag(); timeChunks.ForEach(timeChunk => { List newList = Foo.SomeMethod(x => x.SomeReadTime > timeChunk.StartTime); objectList.Concat(newList); }); 这段代码曾经在Parallel.ForEach()中,但我将其更改为上面所以我可以对其进行故障排除。 变量newList确实有对象,但是在objectList.Concat 行之后,objectList总是有0个对象。 Concat 不能那样工作吗? 我是否需要使用Add()方法一次一个地向ConcurrentBag添加项目?

为什么C#中没有并发集合?

我试图概述C#中集合背后的线程安全理论。 为什么Java中没有并发集合? ( java docs )。 一些集合看起来是线程安全的,但我不清楚这个位置是什么,例如关于: 复合作业, 使用迭代器的安全性, 写操作 我不想重新发明轮子! (我不是一个multithreading的大师,绝对不会低估这有多难)。 我希望社区可以提供帮助。

并发集合在没有Thread.Sleep的情况下吃太多cpu

什么是BlockingCollection或ConcurrentQueue的正确用法,这样你可以自由地出列项目,而不会使用线程烧掉一半或更多的CPU? 我使用2个线程运行一些测试,除非我有一个至少50~100ms的Thread.Sleep,它总是至少达到我CPU的50%。 这是一个虚构的例子: private void _DequeueItem() { object o = null; while(socket.Connected) { while (!listOfQueueItems.IsEmpty) { if (listOfQueueItems.TryDequeue(out o)) { // use the data } } } } 通过上面的例子,我将不得不设置一个thread.sleep,以便cpu不会爆炸。 注意:我也尝试了没有用于IsEmpty检查的时间,结果是一样的。

如何使用ConcurrentQueue 进行线程处理

我试图弄清楚使用队列的最佳方法是什么。 我有一个返回DataTable的进程。 反过来,每个DataTable都与之前的DataTable合并。 有一个问题,在最终的BulkCopy(OutOfMemory)之前要保留的记录太多。 所以,我已经确定我应该立即处理每个传入的DataTable。 考虑ConcurrentQueue …但是我没有看到WriteQueuedData()方法如何知道将WriteQueuedData()列并将其写入数据库。 例如: public class TableTransporter { private ConcurrentQueue tableQueue = new ConcurrentQueue(); public TableTransporter() { tableQueue.OnItemQueued += new EventHandler(WriteQueuedData); // no events available } public void ExtractData() { DataTable table; // perform data extraction tableQueue.Enqueue(table); } private void WriteQueuedData(object sender, EventArgs e) { BulkCopy(e.Table); } } 我的第一个问题是,除了我实际上没有任何事件要订阅的事实,如果我异步调用ExtractData()这将是我需要的全部内容吗? 第二,我是否缺少ConcurrentQueue函数的方式,需要某种forms的触发器与排队对象异步工作? 更新我刚刚从ConcurrentQueue派生了一个具有OnItemQueued事件处理程序的类。 […]