我正在编写一个组件,我已经有一个同步方法从服务器下载文件。这是签名:
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;
由于
答案 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;
}