2010-12-14 36 views
7

Tôi đang viết một ứng dụng Silverlight cho Windows Phone 7 trong đó có một lớp mà cần phải tạo nhiều yêu cầu để WebClient.DownloadStringAsync()nên WebClient trường hợp được tái sử dụng trong Silverlight

Tôi có khấm khá hơn tạo ra một thể hiện mới của WebClient cho mỗi yêu cầu, hoặc là hiệu quả hơn để khởi tạo một cá thể đơn lẻ trong một trường và sử dụng nó cho mỗi yêu cầu (đảm bảo chỉ có một yêu cầu hoạt động tại một thời điểm)?

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 
} 

Trả lời

6

Nếu bạn đang sử dụng WebClient Tôi sẽ tạo một tài khoản mới mỗi lần. Tôi cũng sẽ sử dụng một biểu thức lambda cho sự kiện DownloadStringCompleted vì điều này sẽ cho phép bạn giữ tất cả các logic liên quan với nhau.
ví dụ .:

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

này nên làm cho mã dễ đọc hơn và do đó duy trì.

Trong đó mã smaple của bạn cũng có yêu cầu web lồng nhau (sự kiện hoàn thành bắt đầu một yêu cầu khác) việc tái sử dụng cùng một ứng dụng có thể khiến việc gỡ lỗi trở nên khó khăn hơn.

Hãy lưu ý rằng WebClient tự động sửa đổi sự kiện đã hoàn thành trở lại chuỗi giao diện người dùng để mọi công việc bạn làm ở đó sẽ chặn chuỗi giao diện người dùng đó. Nếu sự kiện đã hoàn thành của bạn thực hiện bất kỳ điều gì khác ngoài bản cập nhật đơn giản cho giao diện người dùng, thay vào đó, hãy sử dụng HttpWebRequest để biết các vấn đề hiệu suất và khả năng sử dụng.

Tôi cũng khuyên bạn không nên thực hiện các yêu cầu web liên tiếp nếu bạn có thể chạy chúng song song hoặc (thậm chí tốt hơn) kết hợp logic (và phản hồi) vào một yêu cầu duy nhất.

2

Bạn cũng nên lưu ý, rằng nếu bất cứ điều gì như WCF client ủy nhiệm client web có thể sẽ không duy trì trong trạng thái hạnh phúc nếu họ gặp khó khăn trong quá trình kết nối. Đó là, nó có lẽ không phải là lỗi khoan dung.

Vì vậy, tôi cho rằng bạn có thể chỉ cần khởi tạo lại nó mỗi lần. Thêm vào đó nếu được sử dụng đúng cách trong các khối using bạn sẽ quản lý tài nguyên của mình hiệu quả hơn (mặc dù BFree chỉ ra, WebClient không phải là tài nguyên đặc biệt nặng).

Không phải điều này đặc biệt hữu ích, nhưng đối với một giải pháp cụ thể về dịch vụ web WCF, chúng tôi đã sử dụng một triển khai dựa trên http://www.acorns.com.au/blog/?p=113 để cung cấp ứng dụng web có khả năng chịu lỗi cho proxy dịch vụ web WCF của chúng tôi. Chúng tôi yêu cầu điều này vì chúng tôi chỉ phụ thuộc tiêm các điểm cuối WCF (hoặc giả lập trong một số trường hợp) khi khởi động.

+0

Tôi biết những gì bạn đang nói về liên quan đến các proxy WCF gắt gỏng có thể xâm nhập vào! Sẽ rất thú vị nếu biết nó tương tự với WebClient của Silverlight. –

+2

@BFree đã xóa câu trả lời của mình, nhưng chỉ để lặp lại rằng không có phương thức Dispose() trong lớp WebClient của Silverlight, vì vậy việc sử dụng các khối không có liên quan ở đây. –

+0

Tuy nhiên, như một sở thích cá nhân, tôi muốn thêm em nếu nó dễ làm như vậy hoặc ghi lại sự xuất hiện đầu tiên - đó là thói quen tốt để luôn loại bỏ bất cứ thứ gì 'IDisposable'; và nó không có hại gì cả cho WebClient. –

Các vấn đề liên quan