- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一些单元测试来验证使用 WeakReferences 的对象是否正常工作。重构这些对象以异步工作后,单元测试失败。这似乎是由于使用异步时 GC.WaitForPendingFinalizers 不工作(或工作方式不同?)引起的。
为了检查这一点,我创建了一个带有两个按钮的简单 WPF 应用程序,一个带有常规点击事件,一个带有异步点击事件。
当我按下 NormalGCTest 按钮时,会显示“对象垃圾已收集:True”。
但是当我按下 AsyncGCTest 按钮时,会显示“对象垃圾收集:False”。
这是怎么回事?有没有办法在我的测试中强制执行完整的垃圾回收?
private void NormalGCTest(object sender, RoutedEventArgs e)
{
var temp1 = new object();
var temp2 = new WeakReference(temp1);
temp1 = null;
GC.Collect();
GC.WaitForPendingFinalizers();
temp1 = temp2.Target;
System.Diagnostics.Debug.WriteLine("object garbage collected: {0}", temp1 == null);
}
private async void AsyncGCTest(object sender, RoutedEventArgs e)
{
var temp1 = new object();
var temp2 = new WeakReference(temp1);
temp1 = null;
GC.Collect();
GC.WaitForPendingFinalizers();
temp1 = temp2.Target;
System.Diagnostics.Debug.WriteLine("object garbage collected: {0}", temp1 == null);
await Task.Delay(0);
}
最佳答案
对我来说,它已经很好用了——我得到了 True
/True
。但是,您可以尝试一些事情来弄清楚正在发生的事情 - 例如:
var wr = CreateWeakReference();
Console.WriteLine("object available: {0}", wr.Target != null);
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
GC.WaitForPendingFinalizers();
Console.WriteLine("object garbage collected: {0}", wr.Target == null);
与
static WeakReference CreateWeakReference()
{
return new WeakReference(new object());
}
这使用较少的局部变量,这可能会导致混淆,具体取决于编译器如何翻译 C#。它还使用了更积极的 GC.Collect
。
但重要的是:停止调用垃圾收集器。你几乎不应该这样做。最后的想法 - 你可能想避免 async void
。是的,我知道这是一个事件处理程序,但一个不错的技巧是立即调用非 async void
方法(必要时使用 await
)。
关于c# - GC.WaitForPendingFinalizers 不在异步方法中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21938673/
我有一些单元测试来验证使用 WeakReferences 的对象是否正常工作。重构这些对象以异步工作后,单元测试失败。这似乎是由于使用异步时 GC.WaitForPendingFinalizers
我很难理解 WaitForFullGCComplete 和 WaitForPendingFinalizers + collect 之间的区别。 我已经知道当创建一个新对象时(它有一个终结器)——在终结
引用来自 GC.WaitForPendingFinalizers() 的 MSDN 文档: The thread on which finalizers are run is unspecified,
我试图通过在析构函数中使用 console.WriteLine() 来确保释放某个类的实例,但输出从未出现。 我仔细搜索了任何挥之不去的引用资料以及事件订阅,但没有找到。只是为了我自己的理智,在我继续
我在网上找到了这段代码,它是在取消初始化 Excel Interop 对象后附加的: GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect()
我开始审查项目中的一些代码并发现了类似这样的内容: GC.Collect(); GC.WaitForPendingFinalizers(); 这些线条通常出现在旨在提高效率的理由下破坏对象的方法上。我
鉴于以下情况: GC.Collect(GC.MaxGeneration); GC.WaitForPendingFinalizers(); GC.Collect(GC.MaxGeneration); 考
我是一名优秀的程序员,十分优秀!