我知道在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期間返回到線程池?
我會轉換'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) –
爲什麼不使用Task.Factory.FromAsync並簡單地將Begin/End轉換爲異步方法? – i3arnon
從t他Nito.AsyncEx文檔:「所有異步操作完成後,Run方法將返回。 「 –