C# 线程安全通用列表块枚举

C# 线程安全通用列表块枚举,c#,vb.net,list,C#,Vb.net,List,首先,我想说的是,我已经在谷歌上查了大概一百个问题,以及与我的问题相关的问题。我找不到任何能回答我具体问题的答案 我将数据表转换为列表。我有多个线程用foreach枚举列表。但是,主线程每5分钟需要用最新数据刷新一次该列表。发生这种情况时,我需要阻止其他线程读取该线程,直到主线程完全更新该列表 我发现的所有文章和问题都阻止了对单个add的访问。我知道我可以为更新编写一个阻塞,但我需要该锁也与枚举的所有其他线程同步。我不想在其他线程正在进行自己的枚举时更新列表 如何编写一个锁,该锁将用于每条语句以

首先,我想说的是,我已经在谷歌上查了大概一百个问题,以及与我的问题相关的问题。我找不到任何能回答我具体问题的答案

我将数据表转换为列表。我有多个线程用foreach枚举列表。但是,主线程每5分钟需要用最新数据刷新一次该列表。发生这种情况时,我需要阻止其他线程读取该线程,直到主线程完全更新该列表

我发现的所有文章和问题都阻止了对单个add的访问。我知道我可以为更新编写一个阻塞,但我需要该锁也与枚举的所有其他线程同步。我不想在其他线程正在进行自己的枚举时更新列表

如何编写一个锁,该锁将用于每条语句以及更新函数

谢谢


编辑:我想在生产者线程生产时阻止“消费者/观察者”。我不希望使用者/观察者彼此阻塞。

将填充和枚举列表的所有代码放入锁块中:

    lock (theList)
    {
       Update(theList);
    }

    lock (theList)
    {
       foreach (var thingy in theList)
       {
         DoStuff(thingy);
       }
    }

一开始我以为你可以试着用一个。它实现了生产者/消费者问题

实际上,您需要的是一种为您的阅读线程和主线程设置rendez-vous的方法


我认为这可以通过监视器来实现(特别是通过使用和方法)。尝试一下,告诉我们您发现了什么。

ReaderWriterLock将非常适合这种情况,在给定的时间点,一个线程写入,多个线程可以读取,但是在给定的时间点只能写入或读取。您的问题并不具体:这是典型的生产者/消费者问题(在您的情况下,它更多的是制作人/观察员,但问题是相同的)。它在web上有大量的文档记录。我觉得奇怪的是,你找不到关于它的任何信息。它可以通过或解决。检查:@MrinalKamboj我建议
ReaderWriterLockSlim
超过
ReaderWriterLock
,以了解几乎所有使用.NET 3.5或更高版本的内容。我需要在制作人制作时阻止消费者/观察者。我不这样做但是希望消费者彼此阻止。现在你阻止了所有读取线程的一致性工作,即使它们不会给彼此造成任何困难。非常糟糕的设计,它会同步所有线程的访问,多个线程甚至无法读取。在这种情况下,我的印象是OP正在寻找非常基本的线程同步。t技术。也许我看错了。解释如何实现多读/一写锁定原语似乎远远超出了范围。为什么框架已经提供了两个,而你却要实现一个呢?谢谢Kryptos,我会让你知道的。