代码之家  ›  专栏  ›  技术社区  ›  Dark Star1

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

  •  1
  • Dark Star1  · 技术社区  · 16 年前

     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 回复  |  直到 16 年前
        1
  •  1
  •   Hans Passant    16 年前

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

    极其

    无论从哪个设备读取数据,都会在堆栈空间用完之前耗尽其缓冲区中的数据。首先,很少有设备能做到这一点,我只知道插座。可能是文件系统,但在这方面很少使用异步I/O。

        2
  •  0
  •   Michael    16 年前

    不是。递归函数会自己调用。除非File.EndRead、HandleDataReceived或BeginAsyncRead调用此函数或调用序列中的其他函数,否则此函数不是递归函数。