如何在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;
}
}
如何使用多线程下载文件。
您的代码有几个问题:
-
你必须关闭这家商店。最好的做法是使用使用语句
使用(var store=IsolatedStorageFile.GetUserStoreForApplication()){//任务}
-
使用多个线程下载东西不会获得任何性能*——连接是瓶颈,而不是每秒的CPU周期。
-
如果你有一个多线程应用程序为同一位置执行IO,那么简单的If(!isf.DirectoryExists("DownloadedFiles"))将不起作用。你有比赛条件。如果一个线程开始创建目录,而第二个线程在第一个线程完成之前检查目录,该怎么办?
-
不要用catch吞下异常(异常ex)。通常情况下,异常具有有关问题的信息。
我会使用与此类似的解决方案来解决此问题。
*多线程应用程序往往是不确定的,下载是否可能更快,但在这种情况下,很可能会更慢。
您正在覆盖循环中的objDownload对象,从而破坏以前的引用。创建文件下载列表并将每个文件添加到上以保持独立。
rob在objDownload方面是正确的,但您完全没有必要使用ThreadPool.QueueUserWorkItem
+Dispatcher.BeginInvoke
,因为WebRequest.BeginGetResponse是异步和非阻塞的。您当前的代码移动到后台线程,然后移动到UI线程,然后执行在后台线程上返回的异步HTTP操作(这非常疯狂)。
旁注:您正在下载的文件是否很大(例如>1mb)?如果是这样的话,你应该使用后台文件传输-即使你的应用程序没有运行,它们也会继续下载。