我正在尝试编写一个程序,在该程序中,我通过将项目放入来自不同线程的集合中并在迭代集合并处理项目的单个线程中清理它们来安排要删除的项目。在这样做之前,我想知道什么会产生最佳性能,所以我尝试了ConcurrentBag、ConcurrentStack和ConcurrentQueue并测量了添加10000000个项目所需的时间。我用下面的程序来测试这个:classProgram{staticListlist=newList();staticConcurrentBagbag=newConcurrentBag();staticConcurrentStackstack=newConcurrentS
如果某个对象未被任何其他对象引用,则它会被.NETCLR垃圾收集器收集。但是,如果objA引用objB,objB引用objC,而objC对objA的引用,垃圾收集器如何确定它们(作为一个整体)可以被收集? 最佳答案 CLR使用一种称为标记清除的技术。作为这项技术的一部分,每个对象都可以被认为是最初标记为收集的。然后,CLR遍历每个可访问对象,从您的全局变量(静态字段等)作为根开始,并清除每个可遍历对象上的标记。然后它会扫除剩余的标记对象。请记住,此“标记”是概念性的;实际上,对象很可能被添加到一个集合集中。在循环自引用对象的情况下,
这是我最近在面试中被问到的一个问题:在“GC.Collect()”调用期间会收集哪些“随机”对象?Stringa=newRandom().Next(0,1)==1?"Whatever1":"Whatever2";Stringb=newWeakReference(newRandom()).Target.Next(0,1)==1?"Whatever1":"Whatever2";GC.Collect();我回答说这是一个特定于实现的问题,它高度依赖于GC实现和相应的弱引用语义。据我所知,C#规范没有提供关于GC.Collect应该做什么以及应该如何处理弱引用的确切描述。但是,我的面试官想听点
我正在尝试将表单序列化值发布到Controller(WebAPI自托管)。我不明白为什么NameValueCollection没有正确绑定(bind)。客户端使用jQuery://FormSubmitHandler$('#form-parameters').submit(function(event){event.preventDefault();varformData=$(this).serialize();//PostserializedformdatapostAssemblyParameters(formData);});//PostFormDatatocontrollertes
在与同事的讨论中,我怀疑.net中的垃圾收集器是在系统范围内工作还是在应用程序范围内工作。意味着如果每个应用程序都有自己的GC那么它会影响系统性能吗?我对此有点困惑。 最佳答案 每个进程都有自己的托管堆,将单独收集。没有系统范围的堆,所以不可能有系统范围的GC。(如果您在同一个进程中运行多个CLR,它们每个也会有自己的GC。不过这种情况非常罕见。) 关于c#-.net中的垃圾收集器是系统范围的还是应用程序范围的?,我们在StackOverflow上找到一个类似的问题:
在回答关于SO的另一个问题*以及随后的评论讨论时,我在一个我不清楚的地方碰壁了。在我误入歧途的任何地方纠正我......当垃圾收集器收集一个对象时,它会在一个单独的线程上调用该对象的终结器(除非终结器已被抑制,例如通过Dispose()方法)。在收集时,GC会挂起除触发收集的线程之外的所有线程(后台收集除外)。不清楚的地方:垃圾收集器是否在收集之前等待终结器在该对象上执行?如果不是,它会在终结器仍在执行时取消挂起线程吗?如果它等待,如果终结器遇到一个被挂起线程持有的锁,会发生什么情况?终结器线程是否死锁?(在我的回答中,我认为这是糟糕的设计,但我可能会看到可能发生这种情况的情况)*原始
我刚刚注意到关于垃圾收集的一些非常奇怪的事情。WeakRef方法按预期收集对象,而async方法报告对象仍然存在,即使我们已强制进行垃圾收集。有什么想法吗?classProgram{staticvoidMain(string[]args){WeakRef();WeakRefAsync().Wait();}privatestaticvoidWeakRef(){varfoo=newFoo();WeakReferencefooRef=newWeakReference(foo);foo=null;GC.Collect();Debug.Assert(!fooRef.IsAlive);}priva
更新我已将此处的各种答案组合成关于newquestion的“权威”答案.原始问题在我的代码中,我有一个事件发布者,它在应用程序的整个生命周期中都存在(这里简化为最基本的):publicclassPublisher{//ValueEventArgsinheritsfromEventArgspubliceventEventHandler>EnabledChanged;}因为这个发布者可以在任何地方使用,我很高兴自己创建了这个小助手类以避免在所有订阅者中重写处理代码:publicstaticclassLinker{publicstaticvoidLink(Publisherpublisher
我认为这是一个C#初学者问题,但我似乎找不到正确的解决方案。我有一个ClassOne对象,它定义了一个事件。我创建了一个ClassTwo对象,它被认为是一个黑盒子,这意味着我不知道它是否会注册到任何事件。ClassTwo的构造函数注册到ClassOne的事件。当ClassTwo对象超出范围时,问题就来了。垃圾收集器从不删除这个对象,因为它从不注销事件。所以我有两个问题:有没有办法让ClassTwo对象知道它何时超出范围?对于老C++程序员来说,这将在析构函数中,但对于C#,这不起作用。是否有调试工具可以帮助我找到此类对象?这是重现问题的示例代码:publicpartialclassMa
让我们看看下面显示问题的片段。classProgram{staticvoidMain(string[]args){vartask=Start();Task.Run(()=>{Thread.Sleep(500);Console.WriteLine("StartingGC");GC.Collect();GC.WaitForPendingFinalizers();Console.WriteLine("GCDone");});task.Wait();Console.Read();}privatestaticasyncTaskStart(){Console.WriteLine("Start");