2012-02-02 67 views
0

我正在开发一个wp7应用程序。我需要从服务器下载一些文件到我的手机。这些文件是从列表框中选择的。当试图下载单个项目时,下载完美。但是,当我尝试同时下载多个项目时,会发生错误。我怎样才能同时下载多个项目?如何在wp7中使用多线程?

这里是我的代码下载文件。

IList<Item> selectedItems = documents.Where(p => p.IsChecked == true).ToList(); 
foreach (var item in selectedItems) 
{ 
    FileDownload objDownload = new FileDownload(); 

    objDownload.FileName = item.Title; 
    objDownload.Url = item.Link; 
    objDownload.DocId = item.DocId; 

    ThreadPool.QueueUserWorkItem(t => 
    { 
    Dispatcher.BeginInvoke(() => 
    { 
     objDownload.DownloadFile(); 
    }); 
    Thread.Sleep(0); 
    }); 
} 

,这里是在FileDownload类中的DownloadFile()方法

public void DownloadFile() 
{ 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); 
    request.AllowReadStreamBuffering = false; 
    request.BeginGetResponse(new AsyncCallback(DownloadFileData), request); 
} 

private void DownloadFileData(IAsyncResult result) 
{ 
    try 
    { 
     AddToDownloadList(); 
     IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication(); 
     string fileName = "DownloadedFiles\\" + FileName; 
     if (!isf.DirectoryExists("DownloadedFiles")) 
      isf.CreateDirectory("DownloadedFiles"); 

     if (!isf.FileExists(fileName)) 
     { 
      IsolatedStorageFileStream streamToWriteTo = new IsolatedStorageFileStream(fileName, FileMode.Create, isf); 
      HttpWebRequest request = (HttpWebRequest)result.AsyncState; 
      HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result); 
      Stream str = response.GetResponseStream(); 
      byte [ ] data = new byte [ 16 * 1024 ]; 
      int read; 
      long totalValue = response.ContentLength; 
      while ((read = str.Read(data, 0, data.Length)) > 0) 
      { 
       streamToWriteTo.Write(data, 0, read); 
      } 
      string file = streamToWriteTo.ToString(); 
      streamToWriteTo.Close(); 
     } 
     OfflineStatus = true; 
    } 
    catch (Exception ex) 
    { 
     OfflineStatus = false; 
    } 
} 

如何使用多线程下载的文件。

+0

什么是错误? – 2012-02-02 09:42:16

+0

错误消息是:“IsolatedStorageFileStream不允许操作”。 – 2012-02-02 10:26:35

回答

3

有几个问题,你的代码:

  • 你必须关闭/处置店。最好的初步实践是使用using语句

    使用(VAR店= IsolatedStorageFile.GetUserStoreForApplication()){ // 任务 }

  • 你不会得到使用多线程下载东西的任何性能* - 连接不是每秒CPU周期的瓶颈。

  • 如果您有一个多线程的应用程序,可以为同一位置执行IO操作,如果(!isf.DirectoryExists(“DownloadedFiles”))不起作用。你有一个竞赛条件。如果一个线程开始创建目录,第二个线程在第一个线程完成之前检查目录,该怎么办?

  • 不要吞下异常与catch(异常ex)。例外情况通常有关于问题的信息。

我会解决这个问题,使用类似的解决方案this one。 *多线程应用程序往往是不确定的,有可能下载会更快,但在这种情况下,最有可能的是,它会更慢。

1

你正在覆盖你的循环中的objDownload对象,破坏以前的引用。 创建FileDownload列表并添加每个以保持独立。

+0

如果我离开此页面,下载过程是否继续? – 2012-02-02 10:15:16

1

rob对你的obj下载是正确的,但是你使用ThreadPool.QueueUserWorkItem + Dispatcher.BeginInvoke是完全不必要的,因为WebRequest.BeginGetResponse是异步和非阻塞的。你当前的代码移动到后台线程,然后移到UI线程,然后执行一个异步HTTP操作,该操作在后台线程上返回(这非常疯狂)。

备注:您下载的文件是否大(如> 1mb)?如果是这样,您应该使用Background File Transfers - 即使您的应用程序未运行,它们也会继续下载。