具有一次性参数和异步等待的 C# 递归
C# recursion with disposable parameter and async await
如果异步方法包含需要释放的参数,递归调用异步方法是否安全?
public async Task<bool> ConnectAsync(CancellationTokenSource cancellationTokenSource)
{
using CancellationTokenSource token = new CancellationTokenSource();
await ConnectAsync(token).ConfigureAwait(false);
}
控制总是return回到创建它的方法的实例是安全的。所以只要你:
- 使用
using
语句或手动调用 Dispose()
,并且
await
来电
然后对象将被正确处理,而不是在使用之前。
但是,与所有递归一样,您需要注意不要以 stack overflow 结束。完全按照您编写的方法,该方法将以堆栈溢出结束。
是的,在 C# 中使用 using 语句的递归是安全的,当被调用者的执行终止并且代码返回给调用者时,对象将被正确处理。
但据我了解,您需要无限递归,在这种情况下,永远不会释放该对象,这并不是因为您的代码不安全,只是无法释放该对象。
反正这里的问题是不能无限递归,很快或之后你会处理栈溢出,c#不支持尾优化,所以C#不支持无限递归。
如果异步方法包含需要释放的参数,递归调用异步方法是否安全?
public async Task<bool> ConnectAsync(CancellationTokenSource cancellationTokenSource)
{
using CancellationTokenSource token = new CancellationTokenSource();
await ConnectAsync(token).ConfigureAwait(false);
}
控制总是return回到创建它的方法的实例是安全的。所以只要你:
- 使用
using
语句或手动调用Dispose()
,并且 await
来电
然后对象将被正确处理,而不是在使用之前。
但是,与所有递归一样,您需要注意不要以 stack overflow 结束。完全按照您编写的方法,该方法将以堆栈溢出结束。
是的,在 C# 中使用 using 语句的递归是安全的,当被调用者的执行终止并且代码返回给调用者时,对象将被正确处理。
但据我了解,您需要无限递归,在这种情况下,永远不会释放该对象,这并不是因为您的代码不安全,只是无法释放该对象。
反正这里的问题是不能无限递归,很快或之后你会处理栈溢出,c#不支持尾优化,所以C#不支持无限递归。