异步下载文件

时间:2014-04-15 04:18:15

标签: c# asynchronous

我打算写一个函数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;
    }

2 个答案:

答案 0 :(得分:2)

我写了一个方法来做到这一点。

    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;
        }
    }

答案 1 :(得分:0)

我知道为什么我丢失了字节。在API上,我返回字节数组,但我使用HttpClient来获取数据。我将HttpResponseMessage更改为return并接受两者的类型。