2014-03-13 80 views
0

我想一個流參數傳遞給一個異步方法,例如:傳遞到流異步方法

async void MyAsyncMethod(Stream s, int i) 
{ 
    await Task.Factory.StartNew(() => 
     { 
      SomeMethodReadingFromStream(s, i); // throws ArgumentException, "Stream was not readable." 
     }); 
} 

當我做MyAsyncMethod不使用異步的await,一切工作正常。

有沒有辦法在異步方法中使用流?

+3

1)不要使用'async void' – SLaks

+2

流在您的異步代碼運行之前可能已關閉。 – SLaks

+0

我相信你會在方法外部處理流。如果是的話就不要那樣做。 –

回答

8

調用方法可能是這樣的:

using(var stream = ...) 
{ 
    MyAsyncMethod(stream, 3); 
} 

既然你蹬掉MyAsyncMethod,然後關閉流,當MyAsyncMethod運行流將被關閉。

解決此問題的一種方法是更改​​MyAsyncMethod簽名以返回任務,然後等待它。

async Task MyAsyncMethod(Stream s, int i) { ... } 

using(var stream = ...) 
{ 
    await MyAsyncMethod(stream, 3); 
} 

這樣,直到MyAsyncMethod完成後,流纔會關閉。

+0

你對調用方法的假設是正確的! –