我正在为一些异步代码编写一个实用程序类,并且我想确保我不会在设计中造成内存泄漏。假设我的代码执行类似于下面的类。(显然你不会编写像这样工作的代码,但我有几个代码路径都汇聚成一个底层函数,其中一个代码路径有效地做到了这一点)。代码中的关键点是我的代码中没有任何内容包含对 theTaskCompletionSource
或其Task
.
假设 Foo 实例是根据需要创建的,并且不是永久植根的。tcs.Task
扎根了吗?更重要的是,假设request
永远不会完成,因此不会设置结果。会tcs.Task
永远闲逛吗?接续任务呢?或者,它们的生命周期是否依赖于 Foo 对象,并且当 Foo 实例被 GC-ed 时它们会消失?
class Foo
{
public void Bar(Action<Action<object>> request, Action<T> callback)
{
var tcs = new TaskCompletionSource<object>();
request(result => tcs.SetResult(result)); // this runs asynchronously
tcs.Task.ContinueWith(task => callback(task.Result));
}
}