我目前正在编写一个组件,其中我已经有一个从服务器下载文件的同步方法。这是签名:
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/