异步下载文件

本文关键字:文件 下载 异步 | 更新日期: 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作为返回和接受类型。