Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于C#应用程序的ArrayList对象上的线程安全的多个并行读线程和偶尔的写线程,最好的方法是什么?_C#_.net_Multithreading_Locking - Fatal编程技术网

对于C#应用程序的ArrayList对象上的线程安全的多个并行读线程和偶尔的写线程,最好的方法是什么?

对于C#应用程序的ArrayList对象上的线程安全的多个并行读线程和偶尔的写线程,最好的方法是什么?,c#,.net,multithreading,locking,C#,.net,Multithreading,Locking,考虑以下场景: 该应用程序是多线程的,它有一个全局使用的静态ArrayList 该应用程序有一个线程,它完全根据不时从数据库读取的数据重构ArrayList 应用程序有N个线程并行读取此全局ArrayList 对于线程安全的多重并行读取和偶尔更改ArrayList对象,最好的方法是什么?我会考虑使用ReaderWriterLockSlim:我会考虑使用ReaderWriterLockSlim:你能不能简单地将ArrayList作为类的静态属性?然后提供get;设置围绕Arraylist对象包

考虑以下场景:

  • 该应用程序是多线程的,它有一个全局使用的静态ArrayList
  • 该应用程序有一个线程,它完全根据不时从数据库读取的数据重构ArrayList
  • 应用程序有N个线程并行读取此全局ArrayList

对于线程安全的多重并行读取和偶尔更改ArrayList对象,最好的方法是什么?

我会考虑使用ReaderWriterLockSlim:

我会考虑使用ReaderWriterLockSlim:

你能不能简单地将ArrayList作为类的静态属性?然后提供get;设置围绕Arraylist对象包装“lock(object objMutex){…}”的访问器?这将确保在所有线程中只有对对象的同步访问。

您不能简单地将Arraylist作为类的静态属性吗?然后提供get;设置围绕Arraylist对象包装“lock(object objMutex){…}”的访问器?这将确保在所有线程中只有对该对象的同步访问。

如果该对象包含从数据库读取的只读数据缓存且从未被修改,则可能不需要任何同步

当然,在设置全局引用之前,您需要完全构建列表,例如:

private static ArrayList myList;

...
myList = GetListFromDatabase();

当写入线程替换列表时,如果出现争用情况,另一个线程可以获取列表的“旧”副本,但如果不修改该副本,则该旧副本仍将保持一致。

如果它包含从数据库读取的只读数据缓存且从未修改过,则可能不需要任何同步

当然,在设置全局引用之前,您需要完全构建列表,例如:

private static ArrayList myList;

...
myList = GetListFromDatabase();

当写入程序线程替换列表时,如果出现争用情况,另一个线程可以获取列表的“旧”副本,但如果不进行修改,此旧副本仍将保持一致。

您还可以查看System.Collections.Concurrent(如果使用.NET 4.0) 此集合针对多线程进行了优化。 关于这个容器的好文章是

您还可以查看System.Collections.Concurrent(如果使用.NET 4.0) 此集合针对多线程进行了优化。 关于这个容器的好文章是

您使用的是什么版本的框架,您使用
ArrayList
而不是
List
或其他一些通用集合有什么原因吗?我使用的是framework 2.0,使用的是
ArrayList
,因为。。。哦,我应该给这篇文章加上一个
初学者
标签:-)你使用的是什么版本的框架,你使用
ArrayList
而不是
List
或其他一些通用集合有什么原因吗?我使用的是framework2.0,使用的是
ArrayList
,因为。。。哦,我应该给这篇文章加上一个
初学者
标签:-)如果他仍然坚持2.0,就不要“苗条”;如果他仍然坚持2.0,就不要“苗条”!它很简单,也很有效。唯一的不便是,在重建ArrayList时,缓存占用2倍的内存,因为“主”ArrayList未被删除,但GC在引用新对象后收集ArrayList。很好!它很简单,也很有效。唯一的不便是,在重建ArrayList时,缓存占用2倍的内存,因为“主”ArrayList没有被删除,但GC在引用新对象后收集ArrayList。