我一直在阅读新的并发集合,特别是ConcurrentBag引起了我的注意.由于ConcurrentBag在每个单独的线程上内部拥有一个本地集来使用它来跟踪项目,这意味着当线程本身超出范围时,ConcurrentBag仍将在内存中引用它.这反过来意味着线程声称的内存,以及本机资源?(请原谅我不知道.NET线程对象的确切内部工作原理)
我可以假设一个用例,你有一个全局ConcurrentBack用于多线程webservice,你有很多客户端添加任务.这些任务由线程池上的线程添加.现在,线程池是一种非常有效的管理线程的方法,但它确实根据工作量删除并创建了线程.因此,这样的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 …Run Code Online (Sandbox Code Playgroud)