异步下载文件
本文关键字:文件 下载 异步 | 更新日期: 2023-09-27 17:58:24
我计划写一个函数DownloadData返回一个字节数组,另一个客户端会调用它来获取字节数组。我的观点是,我不希望客户端应用程序正在等待文件的下载,所以我需要它以异步模式下载。但我很困惑该怎么做
这是我的功能:
public byte[] DownloadData(string serverUrlAddress, string path)
{
if(string.IsNullOrWhiteSpace(serverUrlAddress) || string.IsNullOrWhiteSpace(path))
return null;
// Create a new WebClient instance
WebClient client = new WebClient();
// Concatenate the domain with the Web resource filename.
string url = string.Concat(serverUrlAddress, "/", path);
if (url.StartsWith("http://") == false)
url = "http://" + url;
byte[] data = null;
client.DownloadDataCompleted += delegate(object sender, DownloadDataCompletedEventArgs e)
{
data = e.Result;
};
while (client.IsBusy) { }
return data;
}
我写了一个方法来实现这一点。
public async Task<byte[]> DownloadData(string url)
{
TaskCompletionSource<byte[]> tcs = new TaskCompletionSource<byte[]>();
HttpWebRequest request = WebRequest.CreateHttp(url);
using (HttpWebResponse response = (HttpWebResponse)(await request.GetResponseAsync()))
using (Stream stream = response.GetResponseStream())
using (MemoryStream ms = new MemoryStream())
{
await stream.CopyToAsync(ms);
tcs.SetResult(ms.ToArray());
return await tcs.Task;
}
}
我知道为什么我丢失了字节。在API上,我返回字节数组,但我使用HttpClient来获取数据。我在两者上都更改为HttpResponseMessage作为返回和接受类型。