Я пишу служебный класс для некоторого асинхронного кода, и я хочу убедиться, что я не создаю утечек памяти с дизайном. Предположим, у меня есть код, который выполняется аналогично приведенному ниже классу. (Очевидно, вы не стали бы писать код, который работает так, но у меня есть несколько путей кода, которые все сходятся в единую базовую функцию, и один из этих путей кода эффективно выполняет это). Ключевым моментом в коде является то, что ничто в коде my не содержит ссылки либо на TaskCompletionSource
, либо на его Task
, хотя NET может делать какое-то колдовство, которое делает root их.
Предположим, что экземпляры Foo создаются по мере необходимости и не имеют постоянного рутирования. tcs.Task
рутирован? Что еще более важно, предположим, что request
никогда не завершается, поэтому результат не устанавливается. Будет ли tcs.Task
торчать вечно? А как насчет задачи продолжения? Или их время жизни зависит от объекта Foo, и они go уйдут, когда экземпляр Foo получит G C -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));
}
}