- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在阅读新的并发集合,特别是 ConcurrentBag 引起了我的注意。由于 ConcurrentBag 内部在每个单独的线程上持有一个本地集,使用它来跟踪项目,这意味着当线程本身超出范围时,它仍将在内存中被 ConcurrentBag 引用。这反过来意味着线程要求的内存以及 native 资源? (原谅我不知道 .NET 线程对象的确切内部工作原理)
我可以假设一个用例,其中您有 1 个全局 ConcurrentBack 用于多线程 Web 服务,其中您有很多客户端添加任务。这些任务由线程池上的线程添加。现在线程池是一种非常有效的线程管理方式,但它确实根据工作量删除和创建线程。因此,这样的 web 服务有时会发现自己遇到麻烦,因为底层包仍然引用许多应该被销毁的线程。
我创建了一个快速应用程序来测试这种行为:
static ConcurrentBag<int> bag = new ConcurrentBag<int>();
static void FillBag() { for (int i = 0; i < 100; i++) { bag.Add(i); } }
static void PrintState() { Console.WriteLine("Bag size is: {0}", bag.Count); }
static void Main(string[] args)
{
var remote = new Thread(x =>
{
FillBag();
PrintState();
});
// empty bag
PrintState();
// first 100 items are added on main thread
FillBag();
PrintState();
// second 100 items are added on remote thread
remote.Start();
remote.Join();
// since the remote thread is gone out of scope, what happened to its local storage which is part of the bag?
PrintState();
// now force a cleanup
WeakReference weakRemoteReference = new WeakReference(remote);
remote = null;
GC.Collect();
GC.WaitForPendingFinalizers();
// Now check if the thread still exists
if (weakRemoteReference.IsAlive)
Console.WriteLine("Remote thread still exists");
PrintState();
Console.ReadLine();
Bag size is: 0
Bag size is: 100
Bag size is: 200
Bag size is: 200
Remote thread still exists
Bag size is: 200
最佳答案
ConcurrentBag
确实将东西保存在线程本地存储中,如果你放弃线程,它可能会导致内存泄漏。但是,该实现能够从一个线程的列表中“窃取”项目以提供给另一个线程。如果您编写以下内容,您可以看到这一点:
ConcurrentBag<int> MyBag = new ConcurrentBag<int>();
void DoIt()
{
for (int i = 0; i < 10; ++i)
{
MyBag.Add(i);
}
ThreadPool.QueueUserWorkItem(EmptyBag);
Console.Write("Press Enter:");
Console.ReadLine();
Console.WriteLine("{0} items in bag", MyBag.Count);
}
void EmptyBag(object state)
{
int take;
while (MyBag.TryTake(out take))
{
Console.WriteLine(take);
}
Console.WriteLine("Bag is empty");
}
关于.net - ConcurrentBag 中可能存在内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5353164/
我一直在阅读新的并发集合,特别是 ConcurrentBag 引起了我的注意。由于 ConcurrentBag 内部在每个单独的线程上持有一个本地集,使用它来跟踪项目,这意味着当线程本身超出范围时,它
"ConcurrentBag(T) is a thread-safe bag implementation, optimized for scenarios where the same thread
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Possible memoryleak in ConcurrentBag? 我的应用中出现严重内存泄漏。我使
我正在运行一些使用 ConcurrentBags 的代码。我正在探索 IEnumerable 功能。我运行的代码是 ConcurrentBag bag = new ConcurrentBag(); T
.NET 4.5.1 我有一个包含 200,000 个对象的 ConcurrentBag。一个对象被两个 long 类型的属性认为是“唯一的”。 我需要检查包中是否存在以前存在的唯一对象,如果不存在,
我有一个 .NET 4.5 单实例 WCF 服务,它维护列表中的项目集合,该列表将同时具有并发的读者和作者,但读者比作者多得多。 我目前正在决定是否使用 BCL ConcurrentBag或使用我自己
有没有办法一次将多个项目添加到 ConcurrentBag,而不是一次添加一个?我没有在 ConcurrentBag 上看到 AddRange() 方法,但是有一个 Concat()。但是,这对我不起
我已经在这里阅读了之前关于 ConcurrentBag 的问题但没有找到在多线程中的实际实现示例。 ConcurrentBag is a thread-safe bag implementation,
分析后,我发现我的应用程序中的特定对象将通过使用对象池而不是构造对象池而受益匪浅。此应用程序基于具有多个线程的生产者/消费者队列。 ConcurrentBag 集合基本上是一个对象池,作为应用程序对象
我在使用包含非托管对象的 ConcurrentBag 正确处理 Dispose/Finalization 时遇到问题。运行下面的代码(通常)会在对 TryTake(). 大概在这种情况下,垃圾收集器在
我需要将 ConcurrentBag 设置为可通知的。我需要知道它安全吗?该类的代码是 public class NotifiableConcurrentBag : ConcurrentBag, IN
我有一个静态集合,比如调用远程 rest api 的任务: static ConcurrentBag> _collection = new ConcurrentBag>(); static void
我读到要修改或改变并发包中的对象,我必须将其取出、修改,然后再放回去。 但是,我看到了执行以下操作的代码: var obj = bag.FirstOrDefault(report => report.
当线程添加或删除 ConcurrentBag 的元素时会发生什么而另一个线程正在枚举这个包?新元素是否也会出现在枚举中,删除的元素是否不会出现? 最佳答案 一 jar read the fine ma
我编写了一个程序,其中列表构建器方法返回 IEnumerable of string,其中包括大量字符串(100 万个项目),我将其存储在 List of string 中,然后它将所有项目附加到 中
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Possible memoryleak in ConcurrentBag? 编辑1: 真正的问题是。你能证实
我已经构建了这段代码来并行处理大量字符串之间的字符串比较,以加快速度。 我使用了 ConcurrentBag,因此所有线程(任务)都可以写入线程安全集合。然后我将这个集合转储到一个文件中。 我遇到的问
我有一个应用程序,它有一个存储在 static ConcurrentBag 中的对象列表。 UI 有一个计时器,它运行的方法可以更新 ConcurrentBag 中的对象。 只有一个线程(由计时器启动
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T
如何清除ConcurrentBag?它没有任何方法,如 Clear 或 RemoveAll... 最佳答案 2017 年 10 月 3 日更新:正如@Lou 正确指出的那样,赋值是原子的。在这种情况下
我是一名优秀的程序员,十分优秀!