Tag: 并发

对并发集合线程的linq操作是否安全?

例如以下代码线程安全: ConcurrentQueue _queue = new ConcurrentQueue(); while(true) { for(int y = 0; y _queue.Enqueue(Guid.NewGuid())); } else if (y % 3 == 1) { Guid x; System.Threading.Tasks.Task.Run(() => _queue.TryDequeue(out x)); } else if(y % 3 == 2) { System.Threading.Tasks.Task.Run(() => { if (_queue.Any(t => t == testGuid)) { // Do something } }); } } 编辑:显然标题不够清晰,所以更新代码示例以包含实际的multithreading行为,是的,上面的代码只是multithreading行为的示例 […]

如何创建不重复的ConcurrentQueue?

我需要一个不允许重复的concurent集合(在BlockingCollection中用作Producer / Consumer)。 我不需要严格的元素顺序。 从另一方面,我想最小化元素“活”在集合中的最大时间。 即收集不能是LIFO,理想情况下它应该是FIFO。 好吧,我会说我需要ConcurrentQueue而不允许重复,但是没有重复的ConcurrentBag也可以工作。 为什么C#不包含这样的东西,可能有人已经创建了它? 这个问题是我之前的问题的结果, 什么类型的IProducerConsumerCollection 用于我的任务?

ConcurrentDictionary枚举和锁定

如果我有一个ConcurrentDictionary,我是否需要在使用foreach循环时锁定它?

certificate代码示例失败,没有volatile

下面是一个C#代码示例,它是一个破坏的Java代码的逐字翻译(已certificate破坏(即第二个线程可能无法观察到sharedValue值的变化)至少在Mac OS X 10.9,Java 1.8(64位)上),Arrandale(1插槽x 2核x 2 HT = 4个HW线程)): using System; using System.Threading; class ThreadTest { /* volatile */ private int sharedValue; private void RunAsync() { while (this.sharedValue == 0); } private bool Test() { Thread t = new Thread(this.RunAsync); t.IsBackground = true; t.Start(); Thread.Sleep(10); // Yes I’m aware the operation is not atomic […]

在同步中花费的线程时间是否过高?

今天,我使用Visual Studio 2010性能分析器分析了我的一个C#应用程序。 具体来说,我正在对“ 并发 ”进行概要分析,因为看起来我的应用程序应该具有更多的容量然后才能进行演示。 分析报告显示,线程在同步状态下花费了大约70-80%的时间。 说实话,我不确定这意味着什么。 这是否意味着应用程序遭受了锁定状态? 对于上下文…有大约30个长时间运行的线程绑定到单个AppDomain( 如果这很重要 )并且一些线程非常繁忙(例如while(true) { _waitEvent.WaitOne(0); //do stuff } )。 我意识到这是一个相当模糊的问题……我想我正在寻找一些关于线程同步状态含义的阐释。 多少钱,为什么? ~75%真的很糟糕吗? 我有太multithreading吗? 或者我应该开始寻找其他领域?

如何批量使用BlockingCollection

我想出了一些代码来消耗队列中所有的wating项目。 而不是逐项处理项目,将所有等待项目作为一组处理是有意义的。 我已经宣布我的队列是这样的。 private BlockingCollection items = new BlockingCollection(new ConcurrentQueue); 然后,在消费者线程上,我打算像这样批量阅读这些项目, Item nextItem; while (this.items.TryTake(out nextItem, -1)) { var workToDo = new List(); workToDo.Add(nextItem); while(this.items.TryTake(out nextItem)) { workToDo.Add(nextItem); } // process workToDo, then go back to the queue. } 这种方法缺乏GetConsumingEnumerable ,我不禁想知道我是否错过了更好的方法,或者我的方法是否存在缺陷。 有没有更好的方法来批量使用BlockingCollection ?

File.WriteAllText和Concurrent Accesses

假设我正在使用File.WriteAllText将非常长的字符串写入文件,而另一个线程或进程正在尝试读取同一个文件。 会抛出任何exception吗? 换句话说,File.WriteAllText方法使用的FileShare参数是什么? 它没有写在文档中!

并发文件写入

如何写入可由多个源访问的文本文件(可能以并发方式),确保没有写入操作丢失? 就像,如果两个不同的进程在同一时刻写入文件,这可能会导致问题。 简单的解决方案(不是非常快速而且不是非常优雅)将在开始进程(创建.lock文件或类似文件)时锁定文件并在写入完成时释放它(删除锁定)。 当开始写时,我会检查.lock文件是否存在并延迟写入直到文件被释放。 对于这种情况,建议的模式是什么? 谢谢 编辑我的意思是进程,如来自不同客户端的不同程序,不同用户等,而不是同一程序中的线程

检测ThreadPool WorkItem是否已完成/等待完成

无论出于何种原因, ThreadPool的QueueWorkItem不会返回IAsyncResult或工作项的其他句柄,这将允许等到它完成。 有RegisterWait…方法,但是你必须传递一个WaitHandle并且创建它们很昂贵(参见IAsyncResult文档,它建议你在请求之前延迟创建WaitHandle )。 任务并行库将解决这个缺陷,但在可用之前需要等待很长时间。 那么,这个设计有什么问题: public class Concurrent { private ManualResetEvent _resetEvent; private T _result; public Concurrent(Func f) { ThreadPool.QueueUserWorkItem(_ => { _result = f(); if (_resetEvent != null) _resetEvent.Set(); }); } public WaitHandle WaitHandle { get { if (_resetEvent == null) _resetEvent = new ManualResetEvent(_result != null); return _resetEvent; } … 编辑:我问了一个关于使用异步委托而不是ThreadPool时出现的问题的后续问题 。

entity frameworkIsRowVersion()没有并发检查

我们有一个表,其中有一个名为Version的列,它被映射为SQL rowversion 。 这样做是因为我们有一个外部系统映射到我们的数据,这些数据依赖于每次更新表时更改的列。 最初我们希望这由SQL处理,但现在我们发现我们有Optimistic Concurrencyexception。 虽然这些例外是为了保护数据被覆盖,但对于我们的情况,我们并不关心这一点。 我们只是希望timestamp继续递增,而entity framework不会检查它是否存在并发问题。 有没有办法做到这一点? 制图: Property(t => t.Version).IsRowVersion();