我希望有人能夠看到我在Silverlight中使用異步webclient下載看似複雜的問題。以下是我的問題的詳細信息 -處理取消webclient異步下載的最佳方法
正在下載多頁XML Web請求。將web客戶端代碼移入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的新實例()按下載按鈕,先前的下載還沒有完成,我得到的視圖模型結果好壞參半。我試圖改變按鈕事件 -
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的該實例,它會在每次按下按鈕時重新創建。
如何在創建新請求之前防止啓動另一個下載?如果你需要更多的細節讓我知道..任何幫助將不勝感激。
John-感謝您的見解。我使用的方法類似 - 我在[link](http://msdn.microsoft.com/en-us/gg266452)頁面上找到了設計,該頁面創建了「Wazup」應用程序。基本上下載服務是一個公共靜態服務類,當我調用服務類時,我設置了一個布爾型的「IsDownloading」,當它返回一個結果時,我改變布爾值。該布爾值在調用頁面上創建,因此不需要重新實例化它。 – thebringking 2011-05-24 14:19:45