将Stream传递给异步方法

时间:2014-03-13 15:51:02

标签: c# asynchronous stream async-await

我试图将stream-parameter传递给异步方法,如下所示:

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

当我使MyAsyncMethod不使用async-await时,一切正常。

有没有办法在异步方法中使用流?

1 个答案:

答案 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完成之前,流不会被关闭。