2009-12-11 62 views
1

我正在写一个异步读取回调函数和我学习C#的时刻想问如果下面是递归的(这不是我的,但我的将是类似的构造):我的异步I/O回调函数是否递归?

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()中被调用。

回答

1

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

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

无论您正在读取什么设备,都会在堆栈空间用尽之前将其缓冲区中的数据用完。有几个设备可以做到这一点,我只知道插座。也许文件系统,但你很少使用异步I/O。

0

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

+0

嗯,我想,因为这个函数是从BeginAsyncRead中调用的,另一个调用是放在这里BeginAsyncRead。我想这可能会创建BeginAsyncRead函数的另一个实例。 – 2009-12-11 02:01:41

+0

在这种情况下,是的,但这些类型的递归调用:f1 - > f2 - > f3 - > f4 - > f1是很难理解和调试的,我建议不惜一切代价避免它们。 – Michael 2009-12-11 17:47:41