C # рекурсия с одноразовым параметром и асинхронным ожиданием - PullRequest
1 голос
/ 08 ноября 2019

Безопасно ли вызывать асинхронный метод рекурсивно, если метод содержит параметры, которые должны быть удалены?

public async Task<bool> ConnectAsync(CancellationTokenSource cancellationTokenSource)
{
    using CancellationTokenSource token = new CancellationTokenSource();
    await ConnectAsync(token).ConfigureAwait(false);
}

Ответы [ 2 ]

4 голосов
/ 08 ноября 2019

Безопасно, если этот элемент управления всегда вернется к экземпляру метода, который его создал. Так что, пока вы:

  1. Используйте оператор using или вызов Dispose() вручную, а
  2. await вызов

Тогдаобъект будет удален должным образом, и не раньше, чем он будет использован.

Однако, как и при любой рекурсии, вы должны быть осторожны, чтобы не оказаться в переполнении стека . Этот метод, в точности как вы его написали, закончится переполнением стека.

2 голосов
/ 08 ноября 2019

Да, в C # рекурсия с использованием оператора безопасна, объект будет правильно расположен, когда выполнение вызываемого объекта завершится, и код вернется к вызывающему.

Но, насколько я понимаю, вы хотите бесконечную рекурсиюв этом случае этот объект никогда не будет удален, не потому, что ваш код небезопасен, просто невозможно удалить этот объект.

В любом случае, проблема в том, что вы не можете сделать бесконечную рекурсию, скороили после того, как вы справитесь с переполнением стека, c # не поддерживает хвостовую оптимизацию, поэтому бесконечная рекурсия не поддерживается в C #.

...