Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.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# 如何使用多个线程管理从集合中添加和删除特定项?_C#_.net_Multithreading_C# 4.0_Locking - Fatal编程技术网

C# 如何使用多个线程管理从集合中添加和删除特定项?

C# 如何使用多个线程管理从集合中添加和删除特定项?,c#,.net,multithreading,c#-4.0,locking,C#,.net,Multithreading,C# 4.0,Locking,我有许多线程可以在某些条件下向集合中添加项并从集合中删除特定项。在第一个项目中,读者多于作者。在第二个项目中,读者可能多于作者,也可能少于或等于作者 我应该如何管理向该集合添加/删除 使用什么收藏?简单的列表是否在添加/删除时阻止 使用哪种阻塞机制(lock,readerwriterlocksim,…) 您可以使用命名空间System.Collections.Concurrent中的数据结构。它们封装了您提到的所有三个方面,可以从并发线程使用,而无需显式锁定 见: 例如,ConcurrentBa

我有许多线程可以在某些条件下向集合中添加项并从集合中删除特定项。在第一个项目中,读者多于作者。在第二个项目中,读者可能多于作者,也可能少于或等于作者

  • 我应该如何管理向该集合添加/删除
  • 使用什么收藏?简单的
    列表
    是否在添加/删除时阻止
  • 使用哪种阻塞机制(
    lock
    readerwriterlocksim
    ,…)

  • 您可以使用命名空间
    System.Collections.Concurrent
    中的数据结构。它们封装了您提到的所有三个方面,可以从并发线程使用,而无需显式锁定

    见:

    例如,
    ConcurrentBag
    具有
    ICollection
    接口,是一种线程安全的实现,针对同一线程同时生成和使用存储在包中的数据的场景进行了优化


    如果您需要快速查找对象,您也可以使用
    concurrentdirectionary

    ConcurrentBag无法删除特定项,因为它是一个对象集合无序的错误


    但是BlockingCollection可以通过使用TryTake方法来实现这一点。只需将要删除的项作为参数传递。请参阅:

    BlockingCollection如何?您必须实现它还是需要线程安全的集合?这个问题似乎很有用:@zmbq,我不能通过
    BlockingCollection
    删除特定项目,但如何删除特定项目(使用
    List我可以做的事情)
    myList.remove(myObj)`?我如何处理一些并发收集?
    TryTake
    -尝试从
    ConcurrentBag
    中删除并返回一个对象。它被称为TryTake not remove,因为您不能保证该对象仍然存在。其他一些线程可能已经删除了它。但它不会返回我特定的项目。假设我没有ve
    myObj
    Concurrent Collection
    中,我想使用
    myObj
    项,而不是任何项。我怎么做呢?你可以枚举所有对象,寻找你需要的对象,或者如果你需要快速对象查找,你也可以使用
    concurrentdirectionary
    。如果我使用simple,会不会更简单“列表”,当我想添加或删除它时,我会对它使用
    lock
    ?这将提供我所需要的,对吗?而不仅仅是提供链接,至少发布一个片段或示例,以防它死掉。在阻止集合时,您只能从开始或结束处删除项,而不能从集合中的任何位置删除项。您无法删除特定项目。项目参数被标记为out参数!您不会将要删除的项目传递到
    TryTake
    ,而是传递一个
    out
    参数,如果成功,该参数将设置为下一个可用项目的值。它与
    ConcurrentBag.TryTake
    相同。