在C#中使用異步CTP或vs.net 2011測試版,我們可以編寫遞歸代碼:在C#中異步遞歸是安全的嗎(async ctp/.net 4.5)?
public async void AwaitSocket()
{
var socket = await this.AcceptSocketAsync(); //await socket and >>return<< to caller
AwaitSocket(); //recurse, note that the stack will never be deeper than 1 step since await returns..
Handle(socket); // this will get called since "await" returns
}
在這個特定的示例,代碼異步等待TCP套接字一旦被接受,它將緩存和異步等待另一個。
這似乎工作正常,因爲await部分將使代碼返回到調用方,因此,不會導致堆棧溢出。
所以兩個問題在這裏:
如果我們忽略我們正在處理此示例中插座的事實。 以這種方式進行堆棧自由遞歸是否可行?或者我缺少什麼缺點?
從IO的角度來看,上面的代碼是否足以處理所有傳入的請求? 我的意思是等待一個,一旦被接受,就開始等待另一個。 某些請求會因某種原因而失敗嗎?
那麼,什麼時候'處理(套接字)'運行? – leppie
我沒有看到它本身有什麼問題,但是它爲IMO更直接的'公共異步void AwaitSocket(){while(true){var socket = await this.AcceptSocketAsync();處理(插座); }}'? – hvd
@leppie在'AwaitSocket();'返回後。是的,它確實會回來。 – hvd