相关疑难解决方法(0)

从未完成的任务会发生什么?他们妥善处理?

说我有以下课程:

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自动神奇地知道需要处理调用上下文?

c# task-parallel-library async-await

15
推荐指数
2
解决办法
816
查看次数

如何在.NET 4.x中强制完全垃圾回收?

我在.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中收集该引用?

提前致谢.

.net c# weak-references

10
推荐指数
1
解决办法
5849
查看次数