我正在为一些异步代码编写实用程序类,并且我想确保不会在设计中造成内存泄漏。假设我有与下面的类类似执行的代码。 (显然,您不会编写像这样工作的代码,但是我有几个代码路径都汇聚成一个基础函数,而其中一个代码路径有效地做到了这一点)。代码中的关键点是,尽管[.NET]可能在做一些使它们扎根的伏都教,但my代码中没有任何内容可以引用TaskCompletionSource
或其Task
。
假设Foo实例是根据需要创建的,并且没有永久地植根。 tcs.Task
是否扎根?更重要的是,假设request
从未完成,因此结果未设置。 tcs.Task
会永远流连吗?那继续任务呢?或者,它们的生存期是否取决于Foo对象,并且当Foo实例进行GC编辑时它们会消失吗?
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));
}
}
我正在为一些异步代码编写实用程序类,并且我想确保不会在设计中造成内存泄漏。假设我有与下面的类类似执行的代码。 (...
假设Foo实例是根据需要创建的,而不是永久扎根。 tcs.Task是否已扎根?