说我有以下课程:
class SomeClass
{
private TaskCompletionSource<string> _someTask;
public Task<string> WaitForThing()
{
_someTask = new TaskCompletionSource<string>();
return _someTask.Task;
}
//Other code which calls _someTask.SetResult(..);
}
Run Code Online (Sandbox Code Playgroud)
然后别的,我打电话
//Some code..
await someClassInstance.WaitForThing();
//Some more code
Run Code Online (Sandbox Code Playgroud)
在//Some more code被调用之前不会被_someTask.SetResult(..)调用.调用上下文在内存中等待.
但是,假设SetResult(..)从未被调用过,并且someClassInstance停止被引用并被垃圾收集.这会造成内存泄漏吗?或.Net自动神奇地知道需要处理调用上下文?
我在.NET 4.x中遇到WeakReferences的问题,我正在运行测试以确保某些对象不再被引用(使用WeakReferences)并且我注意到框架版本之间的行为不一致:
using System;
using System.Text;
using NUnit.Framework;
[TestFixture]
public class WeakReferenceTests
{
[Test]
public void TestWeakReferenceIsDisposed()
{
WeakReference weakRef = new WeakReference(new StringBuilder("Hello"));
GC.Collect();
GC.WaitForPendingFinalizers();
GC.WaitForFullGCComplete();
GC.Collect();
var retrievedSb = weakRef.Target as StringBuilder;
Assert.That(retrievedSb, Is.Null);
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
.NET 2.0 PASS
.NET 3.0 FAIL
.NET 3.5 PASS
.NET 4.0 FAIL
.NET 4.5 FAIL
Run Code Online (Sandbox Code Playgroud)
这是在某处记录的吗?
有没有办法强制GC在.NET 4.5中收集该引用?
提前致谢.