强制GC变坏的例子?

Rik*_*kon 8 .net clr garbage-collection

我正在关于.Net CLR GC进行介绍,并且有各种各样的部分,但我想要一个特别的例子,说明如何强制收集可能是危险的或有害的.我知道你可以过早地将事情强加给更高代人,但是(从我能说的话)这实际上只会减慢事情.

我正在考虑一种强迫GC可能真正具有破坏性的情况,而且我一直在努力解决这个问题.

Jam*_*mes 4

这是一个有趣的演示。请注意,您应该运行在发布模式下编译的此演示,否则它可能无法像宣传的那样工作。

版本1:

private void Button_Click(object sender, EventArgs e)
{
    Timer timer = new Timer(Print, null, 0, 1000);
}

private void Print(Object o)
{
    if (textBox1.InvokeRequired)
    {
        Action<object> action = Print;
        textBox1.Invoke(action, o);
        return;
    }

    textBox1.Text = DateTime.Now.ToString();
}
Run Code Online (Sandbox Code Playgroud)

版本 1 会每秒将日期和时间打印到文本框一次。

版本2:

private void Button_Click(object sender, EventArgs e)
{
    Timer timer = new Timer(Print, null, 0, 1000);
}

private void Print(Object o)
{
    if (textBox1.InvokeRequired)
    {
        Action<object> action = Print;
        textBox1.Invoke(action, o);
        return;
    }

    textBox1.Text = DateTime.Now.ToString();

    GC.Collect(); // force a garbage collection
}
Run Code Online (Sandbox Code Playgroud)

现在在版本 2 中,日期和时间只会打印一次,因为在声明之后,不再有对计时器对象的引用,因此计时器对象被收集。

这是一个相当人为的例子,但可能会成为一个很好的演示。

我必须将此归功于杰弗里·里克特(Jeffery Richter)——这是在他的优秀著作中CLR via C#

  • 但在本例中,“GC.Collect()”并不坏,实际上还不错,因为它帮助您发现应用程序中的错误。如果没有“GC.Collect()”,它会在未来某个时候神秘地停止工作。 (2认同)