创建同步方法的异步版本

时间:2017-11-15 09:47:53

标签: c# async-await

我正在编写一个组件,我已经有一个同步方法从服务器下载文件。这是签名:

public Stream DownloadFile(IData data)

现在我想拥有此方法的异步版本并尝试了这个:

 public async Task<Stream> DownloadFileAsync(IData data)
 {
    Stream stream = null;
    await Task.Run(() =>
    {
      DownloadFile(data);
    });
    return stream;
 }

但是,resharper在return stream;下显示了一条曲线,表达式总是为空“。有人能告诉我我的代码有什么问题吗?

我想要做的是在后台运行DownloadFile方法并将控制流返回给调用者。

编辑:这是DownloadFile方法:

var ms = new MemoryStream();

  using (var dtService = new DataTransferService(mConnectionInfo))
  {
    int bytesRead;
    do
    {
      var buffer = new byte[data.ChunkSize];
      bytesRead = dtService.Read(data, buffer);

      if (bytesRead == 0)
      {
        break;
      }

      data.Offset += bytesRead;
      ms.Write(buffer, 0, buffer.Length);
    } while (bytesRead > 0);
  }


  return ms;

由于

3 个答案:

答案 0 :(得分:3)

最好的选择是使用异步I / O重写DownloadFile()方法,例如使用HttpClient。

使用包装器进行当前的DownloadFile()异步是没有意义的 如果你被困在一个要求和给定的基础设施之间,那么只需在造成最小损害的情况下伪造它:

public Task<Stream> DownloadFileAsync(IData data)  // not 'async', just Task<>
{
    return Task.FromResult(DownloadFile(data));
}

答案 1 :(得分:2)

因为您返回了stream变量,而且它null:)

只需退回Task

即可
public async Task<Stream> DownloadFileAsync(IData data)
{
    return await Task.Run(() => DownloadFile(data));
}

答案 2 :(得分:0)

您忘记实际分配流变量:

public async Task<Stream> DownloadFileAsync(IData data)
 {
    Stream stream = null;
    await Task.Run(() =>
    {
      // VVV
      stream = DownloadFile(data);
    });
    return stream;
 }