c# - 您可以在调用 GC.Collect 和 GC.WaitForPendingFinalizers 时出现死锁吗?

标签 c# .net garbage-collection

鉴于以下情况:

GC.Collect(GC.MaxGeneration);
GC.WaitForPendingFinalizers();
GC.Collect(GC.MaxGeneration);

考虑到多线程和垃圾收集模式,在什么情况下您会在 WaitForPendingFinalizers 上发生死锁?

注意:我不是在寻找您不应该调用 GC.Collect 的原因的答案。

最佳答案

// causes a deadlock when built with release config and no debugger attached
// building in debug mode and/or attaching the debugger might keep
// badIdea alive for longer, in which case you won't see the deadlock
// unless you explicitly set badIdea to null after calling Monitor.Enter

var badIdea = new BadIdea();
Monitor.Enter(badIdea);

GC.Collect(GC.MaxGeneration);
GC.WaitForPendingFinalizers();
GC.Collect(GC.MaxGeneration);

// ...

public class BadIdea
{
    ~BadIdea()
    {
        lock (this)
        {
            // ...
        }
    }
}

关于c# - 您可以在调用 GC.Collect 和 GC.WaitForPendingFinalizers 时出现死锁吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4386585/

相关文章:

c# - 使用 C# 启动 Outlook

c# - Reflect.Emit 动态类型内存爆炸

c# - 在相似数据库之间移动数据

.NET MVC 屏蔽密码文本框

javascript - 在 Javascript 函数中创建和存储的对象会发生什么?

unity3d - 有没有办法在 Unity 中准确测量堆分配以进行单元测试?

c# - 我可以在没有 Silverlight 的情况下访问 ExecuteQueryAsync 吗?

c# - Linq-XML 总是那么乱吗?

java - Bug JDK-8191002 不清楚是编程错误还是 JRE 错误

c# - 从程序集中删除强签名