如何使垃圾回收器在超出范围之前对其进行处置? - c#

我知道,当堆栈上不再有对它们的引用时,GC会清理堆上的对象。

我想知道是否有一种方法可以强制GC在此之前采取行动。我遇到的情况是这样的。

public void A(){
    IList foo = bar();
    //does work on foo's items
    foobar();
    //more code before it goes out of scope
}

我希望我可以在调用foobar()之前释放集合使用的内存。有没有办法做到这一点?

ps .:我知道这是不好的代码,但这是一个遗留代码,我现在无法执行任何操作。

更新:正如InBetween所指出的,“允许GC收集任何不可回收的对象,但是并不确定这样做。”不幸的是,我对某些用户有内存要求,并且该应用程序必须将其内存使用率保持在一定范围内,否则我通常会让GC来工作。

参考方案

.NET中的垃圾回收在以下三种情况下被调用:

分配超出了第一代(gen 0)或大对象堆阈值,
系统内存不足,
通过调用GC.Collect方法

根据您的“代码”判断,我可以猜到它会像第一种情况那样被调用,在这种情况下(因为您仍然有对该对象的引用),我建议您将其包装到其他代码块中。例如:

public void A () 
{
    DoSomethingWithTheList();
    foobar();
    //more code before it goes out of scope
}

private void DoSomethingWithTheList()
{
    IList foo = bar();
    //does work on foo's items
}

如果那不可能,那么只需尝试通过将IList对象设置为null来取消引用它,然后调用具有最高生成量的GC.Collect作为应该解决问题的参数。

public void A ()
{
    IList foo = bar();
    //does work on foo's items
    foo = null;
    GC.Collect(2, GCCollectionMode.Forced); // force GC
    foobar();
    //more code before it goes out of scope
}

这假定IList foo中的对象未在其他地方引用

从JAVA调用方法C#.NET - java

我有一个C#.NET项目中创建的dll,我想从Java程序中调用方法。我想知道是否存在实现此目标的机会,然后遇到了JNA和JNI。我应该使用哪一个?有什么建议么?我只需要在使用C#.NET编写的类中调用方法并处理Java程序的结果即可。 参考方案 这取决于您的应用程序,但是您可以将C#DLL放在服务中,例如WCF并以这种方式将功能公开给Java代码。使用ws…

从ASP.NET 1.1转换为ASP.Net 3.5后,单选按钮停止工作 - javascript

[我在下面以FYI的形式发布我们的问题和解决方案。如果您有Microsoft或代表机构对此问题的正式声明,我会将其标记为答案。否则,我下面的帖子将作为答案]。问题:我们采用了ASP.Net 1.1程序,并将其转换为ASP.Net 3.5。该页面最初正确显示,默认情况下选中一个单选按钮,并显示一个项目列表(“列表A”)。当我们单击另一个单选按钮时,它将正确显示…

.NET Core解决方案中同时具有API和MVC项目的约定 - c#

我有一个由以下项目构成的ASP.NET Core(.NET Core 2.2)应用程序:API:表示WebAPI(控制器继承ControllerBase)服务:包含API控制器用来访问数据库等的服务数据库:它包含常用的数据库存储库,服务层可利用这些数据库访问数据库现在,我想添加一个与API对话的UI(MVC部分位于.NET核心之前)。 .NET Core如何…

ddl在服务器中未更新-asp.net - javascript

我在ASP.NET c#上工作。我有一个DropDownList。 (runat =“ server”)在$ {document).ready上,我更新了它的值:$(document).ready(function () { document.getElementById("ddl").value = "abc"; ……

在ASP.NET MVC中创建数据库回调的最有效方法 - c#

我有一个ASP.NET MVC网页,该网页基本上通过日期过滤器显示MS SQL数据库中表的行。当新行插入数据库表时,我想用新行列表更新网页视图。实现此目标的最有效方法是什么?基本上,我想从我的JavaScript创建一个到数据库服务器的回调,以用新结果更新UI。假设数据库表中的行数很大。(〜1百万)谢谢,cas 参考方案 如果数据库更新非常频繁,则可以按特定…