C# 是静态列表<;WeakReference>;需要?

C# 是静态列表<;WeakReference>;需要?,c#,multithreading,windows-services,weak-references,C#,Multithreading,Windows Services,Weak References,我正在对一个旧的windows服务进行反向工程,该服务是使用ILSpy在vb.net中编写的。我想用C#重写遗留服务。原始服务泄漏内存 当我查看源代码时,服务类中有以下声明: private static List<WeakReference> __ENCList = new List<WeakReference>(); List<WeakReference> _ENCList = imineRun.__ENCList; Monito

我正在对一个旧的windows服务进行反向工程,该服务是使用ILSpy在vb.net中编写的。我想用C#重写遗留服务。原始服务泄漏内存

当我查看源代码时,服务类中有以下声明:

private static List<WeakReference> __ENCList = new List<WeakReference>();
List<WeakReference> _ENCList = imineRun.__ENCList;
            Monitor.Enter(_ENCList);
            try
            {
                imineRun.__ENCList.Add(new WeakReference(this));
            }
            finally
            {
                Monitor.Exit(_ENCList);
            }
private static List\uuu ENCList=new List();
此列表仅在构造函数中使用,如下所示(imineRun是服务类):

List\u ENCList=imineRun.\u ENCList;
监视器。输入(_ENCList);
尝试
{
imineRun.uu ENCList.Add(新的WeakReference(this));
}
最后
{
监视器。退出(_ENCList);
}

此列表是否会导致内存泄漏?需要这个列表吗?它的目的是什么?

因为它在代码中没有使用,所以它不是服务的必要部分。现在,我环顾四周,就像我以前在IL输出中看到的一样,很明显,您已经无意中发现了这一点。根据博客文章,它显然可能是高内存使用率的罪魁祸首

让模块以调试模式构建并在生产服务器上运行从来都不是一个好主意。在本例中,调试模式模块与这些模块实现了VisualStudio的“编辑并继续”功能的_uEnclist helper类相结合

我敢打赌,它是在完全支持调试的情况下编译的,而不是作为发行版的可执行文件


您可以安全地忽略端口中的此代码。

imineRun.\u ENCList
在其他任何地方都没有使用?@sixlettervariables仅在构造函数中使用。Weakreference是一个可以忽略的项目,但不必在GC come收集时删除。我不知道该代码是公认的做法还是糟糕的编码。@NicholasButler我可以……我不确定它是否仍然免费,我没有安装它。我很确定它会给出同样的结果。反射器不再是免费的(抱怨)。另一个很好的选择是dotPeek。但我非常怀疑反编译的输出是否会有任何重大区别。+1肯定会让OP的生活更轻松,如果他所要做的只是在释放模式下重新编译源代码以修复内存问题:)