2014-04-15 143 views
-3

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

提示:'while'循环块.. –

+0

您使用的是什么框架?看起来像你正在等待,直到下载完成,这是异步做这件事的目的 –

回答

0

我知道为什么我失去了字节。在API上,我返回字节数组,但我使用HttpClient获取数据。我更改为HttpResponseMessage作为返回和接受两种类型。

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

嗨@rezomegreldize问题来自客户端,你如何从客户端调用? – TPL

+2

如果允许使用WebClient类的DownloadDataTaskAsync方法使用异步/等待尝试。 –