c# - 创建同步方法的异步版本

标签 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; “expression is always null” 下向我展示了一条波浪线。有人可以告诉我我的代码有什么问题吗?

我想做的是在后台运行 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;

谢谢

最佳答案

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

使用包装器使当前的 DownloadFile() 异步是没有意义的。
如果您在需求和给定的基础架构之间陷入困境,那么只需伪造它,同时造成最少的损害:

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

关于c# - 创建同步方法的异步版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47304079/

相关文章:

c# - 我将如何构造 PrintNode() 方法?

c# - 如何在移动应用程序中动态调整窗口窗体的大小?

c# - xamarin 表单中的异步 Task<T> 问题

asynchronous - 为什么async-std的task::spawn阻止了后续代码行的执行?

c# - 为并行 API 调用添加延迟

c# - ContinueWith 丢失 SynchronizationContext

c# - 使用 [==] 运算符和 .Equals() 的 Int、Char、Object 数据类型

c# - 如何在同一个网站调用一个webservice?

c# - 计算 double 最后一位的单位 (ULP)

c# - 未处理的异常处理程序后 Winforms 应用程序仍然崩溃