相关疑难解决方法(0)

C# WeakReference 对象在终结器中为 NULL 尽管仍然被强引用

嗨,我在这里有代码,我不明白为什么我会遇到断点(请参阅评论)。

这是我不知道或我不正确理解的 Microsoft 错误吗?

代码在 Debug 中进行了测试,但我认为它不应该改变任何东西。

注意:您可以直接在控制台应用程序中测试代码。

仅供参考...在 supercat 回答之后,我使用建议的解决方案修复了我的代码,并且效果很好:-) !!! 不好的是静态字典的使用和性能随之而来但它的工作原理。...几分钟后,我意识到 SuperCat 给了我所有的提示,让我做得更好,解决静态字典,我做到了。代码示例是:

  1. 带有错误的代码
  2. 代码已更正但使用静态 ConditionalWeakTable
  3. 使用包含 SuperCat 技巧的 ConditialWeakTable 编写代码(非常感谢他!)

样品...

using System;
using System.Collections.Generic;
using System.Diagnostics;

namespace WeakrefBug
{

// **********************************************************************
class B : IDisposable
{
    public static List<B> AllBs = new List<B>();

    public B()
    {
        AllBs.Add(this);
    }

    private bool disposed = false;
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            AllBs.Remove(this);
            disposed = true;
        }
    }

    ~B() …
Run Code Online (Sandbox Code Playgroud)

c# garbage-collection weak-references finalizer

4
推荐指数
2
解决办法
2059
查看次数