我正在写一个异步读取回调函数,因为我正在学习C#,此时想询问以下是否是递归的(它不是我的,但我的类似是构造):
protected void ReadCompleted(IAsyncResult iResult)
{
byte[] byIn = (byte[])iResult.AsyncState;
try
{
File.EndRead(iResult);
try
{
HandleDataReceived(byIn);
}
finally
{
BeginAsyncRead(); //recursion??
}
}
catch (IOException ioexc)
{
// Device has been removed!
}
}
现在我并不是特别反对递归,但我喜欢在编写具有巨大内存消耗潜力的东西时避免它。 整个函数本身是从BeginAsync()中调用的。
答案 0 :(得分:1)
是的,有可能。异步操作可以同步完成,这就是IAsyncResult接口具有CompletedSynchronously属性的原因。这是否会导致您的程序出现问题有点难以猜测,您的代码段中没有足够的上下文。
你不必担心的一件事是记忆,如果它完全同步,你就不再消耗了。如果你有足够的堆栈空间,那就担心了。当您的BeginAsyncRead()方法仍在执行时,将再次调用ReadCompleted回调。我只能说,非常不太可能得到StackOverflowException。我从来没有听说有人患过这个问题。
在您的堆栈空间不足之前,您正在读取的任何设备都会在其缓冲区中耗尽数据。很少有设备可以做到这一点,我只知道插座。也许是文件系统,但你很少使用异步I / O.
答案 1 :(得分:0)
没有。递归函数调用自身。除非File.EndRead,或HandleDataReceived或BeginAsyncRead调用此函数或调用序列中的某些其他函数,否则此函数不是递归的。