我希望有人可以了解一下看似复杂的问题,我在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的那个实例有效,它会在每个按钮上重新创建..
如何在创建新请求之前阻止其他下载启动?如果您需要更多详细信息,请告诉我们。任何帮助将不胜感激。
答案 0 :(得分:0)
我认为布尔值是正确的路径 - 我之前遇到过类似情况并使用布尔值来解决我的问题。您可以尝试在您的App类中存储布尔值,以便每次创建新的RequestClass
时都不会重新创建它。