Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.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# 如果您知道访问模式不利,那么ConcurrentBag仍然是支持对象池的正确选择吗?_C#_Multithreading_Concurrent Collections - Fatal编程技术网

C# 如果您知道访问模式不利,那么ConcurrentBag仍然是支持对象池的正确选择吗?

C# 如果您知道访问模式不利,那么ConcurrentBag仍然是支持对象池的正确选择吗?,c#,multithreading,concurrent-collections,C#,Multithreading,Concurrent Collections,在分析之后,我发现我的应用程序中的特定对象将通过使用对象池而不是构建对象池而受益匪浅。此应用程序基于具有多个线程的生产者/消费者队列 ConcurrentBag集合基本上是一个ObjectPool,作为应用程序对象池的后备存储似乎很完美。如果我理解正确,ConcurrentBag在概念上是这样工作的: 保存袋装物品的本地集合。插入时添加到此集合,删除时从此集合中删除 如果本地集合中没有元素并且必须删除对象,则从另一个线程的本地集合中窃取一个 问题是我已经知道应用程序总是在线程“A”上请求对象,并

在分析之后,我发现我的应用程序中的特定对象将通过使用对象池而不是构建对象池而受益匪浅。此应用程序基于具有多个线程的生产者/消费者队列

ConcurrentBag集合基本上是一个ObjectPool,作为应用程序对象池的后备存储似乎很完美。如果我理解正确,ConcurrentBag在概念上是这样工作的:

  • 保存袋装物品的本地集合。插入时添加到此集合,删除时从此集合中删除
  • 如果本地集合中没有元素并且必须删除对象,则从另一个线程的本地集合中窃取一个
  • 问题是我已经知道应用程序总是在线程“A”上请求对象,并且总是在线程“B”上返回它。因此,它将始终默认为steal案例


    了解此访问模式后,是否最好使用框架提供的不同集合来支持对象池?

    对于您的用例,ConcurrentQueue将是更好的使用结构。正如您猜测的那样,ConcurrentBag应该只在您主要从同一个线程插入和拉出时使用,ConcurrentQueue没有线程亲缘关系


    大多数生产者-消费者模型都有单独的线程写入和读取,这就是为什么
    BlockingCollection
    使用
    ConcurrentQueue
    作为其默认备份存储。

    没有将此作为答案发布,因为我无法100%确定它对您的具体案例可能产生的所有影响,但是我相当肯定,当池化对象时,
    ConcurrentBag
    是一个选择的集合。每个线程都有一个池是必要的吗?@YuvalItzchakov您的意思是在我的代码中,还是在
    ConcurrentBag
    的实现中?