如何在wp7中使用多线程

本文关键字:多线程 wp7 | 更新日期: 2023-09-27 18:22:18

我正在开发一个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;
    }
}

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

如何在wp7中使用多线程

您的代码有几个问题:

  • 你必须关闭这家商店。最好的做法是使用使用语句

    使用(var store=IsolatedStorageFile.GetUserStoreForApplication()){//任务}

  • 使用多个线程下载东西不会获得任何性能*——连接是瓶颈,而不是每秒的CPU周期。

  • 如果你有一个多线程应用程序为同一位置执行IO,那么简单的If(!isf.DirectoryExists("DownloadedFiles"))将不起作用。你有比赛条件。如果一个线程开始创建目录,而第二个线程在第一个线程完成之前检查目录,该怎么办?

  • 不要用catch吞下异常(异常ex)。通常情况下,异常具有有关问题的信息。

我会使用与此类似的解决方案来解决此问题。

*多线程应用程序往往是不确定的,下载是否可能更快,但在这种情况下,很可能会更慢。

您正在覆盖循环中的objDownload对象,从而破坏以前的引用。创建文件下载列表并将每个文件添加到上以保持独立。

rob在objDownload方面是正确的,但您完全没有必要使用ThreadPool.QueueUserWorkItem+Dispatcher.BeginInvoke,因为WebRequest.BeginGetResponse是异步和非阻塞的。您当前的代码移动到后台线程,然后移动到UI线程,然后执行在后台线程上返回的异步HTTP操作(这非常疯狂)。

旁注:您正在下载的文件是否很大(例如>1mb)?如果是这样的话,你应该使用后台文件传输-即使你的应用程序没有运行,它们也会继续下载。