我的异步I / O回调函数是递归的吗?

时间:2009-12-11 01:10:48

标签: c# .net-3.5 asynchronous

我正在写一个异步读取回调函数,因为我正在学习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()中调用的。

2 个答案:

答案 0 :(得分:1)

是的,有可能。异步操作可以同步完成,这就是IAsyncResult接口具有CompletedSynchronously属性的原因。这是否会导致您的程序出现问题有点难以猜测,您的代码段中没有足够的上下文。

你不必担心的一件事是记忆,如果它完全同步,你就不再消耗了。如果你有足够的堆栈空间,那就担心了。当您的BeginAsyncRead()方法仍在执行时,将再次调用ReadCompleted回调。我只能说,非常不太可能得到StackOverflowException。我从来没有听说有人患过这个问题。

在您的堆栈空间不足之前,您正在读取的任何设备都会在其缓冲区中耗尽数据。很少有设备可以做到这一点,我只知道插座。也许是文件系统,但你很少使用异步I / O.

答案 1 :(得分:0)

没有。递归函数调用自身。除非File.EndRead,或HandleDataReceived或BeginAsyncRead调用此函数或调用序列中的某些其他函数,否则此函数不是递归的。