2010-12-14 91 views
7

我寫爲Windows Phone 7 Silverlight應用程序,其具有需要進行多次請求WebClient.DownloadStringAsync()如果WebClient的情況下,在Silverlight

是一個類被重用我最好創建Web客戶端的一個新實例每個請求,還是在字段中初始化單個實例並將其用於每個請求(確保一次只有一個請求活動)更高效?

public class MainViewModel : INotifyPropertyChanged 
{ 
    private readonly WebClient _wc; 

    public MainViewModel() 
    { 
     _wc = new WebClient 
     { 
      Credentials = new NetworkCredential("yyyyyyy", @"xxxxxx") 
     }; 

    } 

    readonly Uri _baseUrl = new Uri(@"https://some.web.url"); 

    public void GetServices() 
    { 
     _wc.DownloadStringCompleted += GetServicesCompleted; 
     var uri = new Uri(_baseUrl, "/path"); 
     _wc.DownloadStringAsync(uri); 
    } 

    private void GetServicesCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 
     _wc.DownloadStringCompleted -= GetServicesCompleted; 

     string result = e.Result; 

     // other logic... 

     GetServiceResources(); 
    } 

    private void GetServiceResources() 
    { 
     _wc.DownloadStringCompleted += GetServicesResourcesDownloaded; 
     var url = new Uri(_baseUrl, "/path2"); 
     _wc.DownloadStringAsync(url); 
    } 

    // etc 
} 

回答

6

如果您使用的是WebClient,我會每次創建一個新的。我還會爲DownloadStringCompleted事件使用lambda表達式,因爲這可以讓您將所有相關的邏輯保存在一起。
例如: -

var wc = new WebClient(); 
wc.DownloadStringCompleted += (sender, e) => { GetServiceResources(); }; 
wc.DownloadStringAsync(new Uri("http://example.com/path", UriKind.Absolute)); 

這應該使代碼更易於閱讀,從而維護。

因爲你的smaple代碼也有嵌套的web請求(完成的事件啓動另一個請求),重複使用同一個客戶端可能會使調試更加困難。

請注意,WebClient會自動將已完成的事件封送回UI線程,因此您在那裏執行的任何工作都將阻止該UI線程。如果您完成的活動除了對用戶界面進行了簡單更新之外的任何操作,則建議使用HttpWebRequest,而不是用於性能和可用性問題。

如果你可以並行或者(甚至更好)將邏輯(和響應)合併成一個請求,我還建議不要進行連續的Web請求。

2

你也應該知道,如果像WCF客戶端代理的任何Web客戶端可能不會停留在一個幸福的狀態,如果在連接過程中出現錯誤。也就是說,這可能不是容錯。

因此,我認爲你應該每次重新實例化它。另外,如果在using塊中正確使用,則可以更有效地管理資源(儘管BFree指出,WebClient不是特別繁重的資源)。

這不是特別有幫助,但對於WCF Web服務特定的解決方案,我們使用基於http://www.acorns.com.au/blog/?p=113的實現爲我們的WCF Web服務代理提供容錯Web客戶端。我們需要這樣做,因爲我們在啓動時只依賴注入WCF端點(或在某些情況下模擬)。

+0

我知道你在談論關於脾氣暴躁的狀態WCF代理可以讓自己進入!知道它是否與Silverlight的WebClient相似也會很有趣。 – 2010-12-14 22:37:58

+2

@BFree已經刪除了他的答案,但只是重複說明Silverlight的WebClient類中沒有Dispose()方法,所以在這裏使用塊不相關。 – 2010-12-15 03:58:21

+0

然而,作爲一種個人偏好,如果容易這樣做或者記錄第一次發生,我會添加em - 總是處置任何'IDisposable'是一種好習慣;即使是WebClient也沒有什麼不好的。 – 2010-12-15 10:18:29