处理取消web客户端异步下载的最佳方式

本文关键字:最佳 方式 下载 异步 取消 web 客户端 处理 | 更新日期: 2023-09-27 17:53:54

我希望有人能阐明一个看似复杂的问题,我有在silverlight异步web客户端下载。这是我的问题的细节-

下载多页XML web请求。将web客户端代码移动到helper类中,以跟踪每个单独的请求。helper类称为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()的新实例,则先前的下载尚未完成,并且我在视图模型中得到混合结果。我尝试将按钮事件更改为-

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的实例有效,它在每次按下按钮时重新创建。

如何在创建新请求之前阻止另一个下载开始?如果你需要更多的细节,请告诉我。任何帮助都将非常感激。

处理取消web客户端异步下载的最佳方式

我认为布尔值是正确的路线——我以前遇到过类似的情况,并使用布尔值来解决我的问题。你可以尝试将布尔值存储在你的App类中,这样它就不会在每次创建新的RequestClass时都被重新创建。