2011-04-28 84 views
1

我希望有人能夠看到我在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的該實例,它會在每次按下按鈕時重新創建。

如何在創建新請求之前防止啓動另一個下載?如果你需要更多的細節讓我知道..任何幫助將不勝感激。

回答

0

我認爲布爾值是正確的路線 - 我以前遇到類似的情況,並使用布爾值來解決我的問題。您可以嘗試在您的App類中存儲布爾值,以便每次創建新的RequestClass時都不會重新創建它。

+0

John-感謝您的見解。我使用的方法類似 - 我在[link](http://msdn.microsoft.com/en-us/gg266452)頁面上找到了設計,該頁面創建了「Wazup」應用程序。基本上下載服務是一個公共靜態服務類,當我調用服務類時,我設置了一個布爾型的「IsDownloading」,當它返回一個結果時,我改變布爾值。該布爾值在調用頁面上創建,因此不需要重新實例化它。 – thebringking 2011-05-24 14:19:45

相關問題