2014-01-24 38 views
3

我知道在ASP.NET中,工作線程在使用await時會返回到池,而I/O發生在後臺,這對於可伸縮性非常有用。調用C#的.NET Windows Service中的I/O回調是否可以等待不會被阻止?

我的Windows服務是一個套接字服務器,它使用開始/結束樣式異步套接字I/O。混合我的魔力,我知道。我在EndRead回調中,收到一個請求來完成工作。我不想讓回調阻塞的線程。

我使用Nito.AsyncEx庫,使用AsyncContext.Run(()=> DoMyBiddingHopefullyInTheBackground(...))...

private void EndRead(IAsyncResult result) 
{ 
    int nRead = m_socketStream.EndRead(result); 
    ... 
    AsyncContext.Run(() => DoMyBiddingHopefullyInTheBackground(...)) 
} 

private async Task DoMyBiddingHopefullyInTheBackground(...) 
{ 
    await DoSomeAsyncIoWork(); 
} 

使用AsyncContext是我能找到的唯一途徑非異步標記的代碼來調用使用await的異步標記代碼。

AsyncContext.Run會阻塞調用我的套接字結束回調例程的線程嗎?如果是這樣,是否有任何方法可以使該線程在異步/等待I/O期間返回到線程池?

+1

我會轉換'BeginRead' /'EndRead'([APM模式] (http://msdn.microsoft.com/en-us/library/ms228963%28v=vs.110%29.aspx))到基於異步/等待([TPM模型](http://msdn.microsoft .com/en-us/library/hh873175%28v = vs.110%29.aspx))或者通過使用'ReadAsync'(如果可用)或通過['Task.Factory.FromAsync('](http:// msdn。 microsoft.com/en-us/library/system.threading.tasks.taskfactory.fromasync%28v=vs.110%29.aspx) –

+0

爲什麼不使用Task.Factory.FromAsync並簡單地將Begin/End轉換爲異步方法? – i3arnon

+0

從t他Nito.AsyncEx文檔:「所有異步操作完成後,Run方法將返回。 「 –

回答

1

如果你想運行一個async方法,你不想等待它完成,試試這個:

Task.Run(() => DoMyBiddingInTheBackground()); 
+0

@Scott:不會產生新線程[Doc ](http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.run(v = vs.110).aspx)說:「排隊指定的工作在ThreadPool上運行」 –

+0

同意本,它不會產生一個新的線程。我經常使用它,它可以很好地縮放。 –

+0

Task.Run如何與Nito.AsyncEx的AsyncContext.Run進行比較?我得到的感覺是,Nito類庫處理了很多細節,使我的代碼更簡單,行爲更具可預測性。可能有關於異常處理的事情。或者我應該放棄Nito庫並使用Task.Run? –

相關問題