2014-03-13 42 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

你对调用方法的假设是正确的! –