【问题标题】:Passing Stream to async method将 Stream 传递给异步方法
【发布时间】:2014-03-13 15:51:01
【问题描述】:

我正在尝试将流参数传递给异步方法,如下所示:

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

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

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

【问题讨论】:

  • 1) 不要使用async void
  • 流可能在您的异步代码运行之前已关闭。
  • 我相信你是在方法之外处理流。如果是,请不要这样做。
  • 不要将Task.Factory.StartNewasync-await 一起使用。如果确实需要,请改用Task.Run

标签: c# asynchronous stream async-await


【解决方案1】:

调用方法大概是这样的:

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

由于您启动 MyAsyncMethod 然后关闭流,所以当 MyAsyncMethod 运行时,流将被关闭。

解决此问题的一种方法是更改​​MyAsyncMethod 签名以返回任务,然后等待它。

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

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

这样,在MyAsyncMethod 完成之前不会关闭流。

【讨论】:

  • 你对调用方法的假设是正确的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
相关资源
最近更新 更多