处理取消webclient异步下载的最佳方法

时间:2011-04-28 21:06:03

标签: c# silverlight windows-phone-7 asynchronous webclient

我希望有人可以了解一下看似复杂的问题,我在Silverlight中使用异步webclient下载。以下是我的问题的详细信息 -

下载多页XML Web请求。将webclient代码移动到helperclass中以跟踪每个单独的请求。辅助类称为SyncJobsClass。该课程的来源为(http://www.silvergeek.net/silverlight/running-async-tasks-synchronously-events-delegates/

有一个下载按钮来启动任务 -

void button1_Click(object sender, RoutedEventArgs E)
{
var req = new RequestClass;
req.GetXMLPages();
}

这是请求类 -

Public Class RequestClass
{
readonly SyncJobsClass _syncJobs = new SyncJobsClass();

Public void GetXMLPages()
{

_syncJobs += new SyncJobsElementCompleted;
_syncJobs += new SycJobsWorkCompleted;

var pages = 10

   for(var i=0;i<10;i++)
   {
      //load each request into list in _syncjobs class
      var url ="www.blahblahblah.com" + i;
      _syncJobs.DownloadFiles(url);

   }
      //start download of each page in list
     _syncJobs.StartDownload();

}


}

因此,在此步骤之后您可以看到我有一个异步下载的页面队列。页面完成后,我将它们传递给XML Linq格式化程序,然后将结果数据绑定到我的ViewModel。

void SyncJobsElementCompleted(string result)
{

if(result == "error")return;

//send data to XML linq parser and add to observable collection for viewmodel.
App.ViewModel.LoadData(result);


}

如果我通过按下下载按钮创建GetXMLPages()的新实例,则问题是大量下载,之前的下载尚未完成,我在viewmodel中得到了混合结果。我尝试将按钮事件更改为 -

void button1_Click(object sender, RoutedEventArgs E)
    {
    var req = new RequestClass;

    //Clear view model before download
     App.Viewmodel.List.Clear()
   // now get pages
    req.GetXMLPages();
    }

这不起作用,因为下载仍然在另一个线程中..

尝试了一个boolen,但这只对RequestClass的那个实例有效,它会在每个按钮上重新创建..

如何在创建新请求之前阻止其他下载启动?如果您需要更多详细信息,请告诉我们。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我认为布尔值是正确的路径 - 我之前遇到过类似情况并使用布尔值来解决我的问题。您可以尝试在您的App类中存储布尔值,以便每次创建新的RequestClass时都不会重新创建它。