处理取消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的实例有效,它在每次按下按钮时重新创建。
如何在创建新请求之前阻止另一个下载开始?如果你需要更多的细节,请告诉我。任何帮助都将非常感激。
我认为布尔值是正确的路线——我以前遇到过类似的情况,并使用布尔值来解决我的问题。你可以尝试将布尔值存储在你的App类中,这样它就不会在每次创建新的RequestClass
时都被重新创建。