System.Net.Http.HttpClient và System.Net.Http.HttpClientHandler trong .NET Framework 4.5 triển khai IDis Dùng (thông qua System.Net.Http.HttpMessageInvoker ).
Các using
tài liệu tuyên bố nói:
Theo quy định, khi bạn sử dụng một đối tượng IDis Dùng một lần, bạn nên khai báo và khởi tạo nó trong một câu lệnh sử dụng.
Câu trả lời này sử dụng mẫu này:
var baseAddress = new Uri("http://example.com");
var cookieContainer = new CookieContainer();
using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
{
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("foo", "bar"),
new KeyValuePair<string, string>("baz", "bazinga"),
});
cookieContainer.Add(baseAddress, new Cookie("CookieName", "cookie_value"));
var result = client.PostAsync("/test", content).Result;
result.EnsureSuccessStatusCode();
}
Nhưng các ví dụ rõ ràng nhất từ Microsoft không gọi Dispose()
một cách rõ ràng hoặc ngầm định. Ví dụ:
- Bài viết blog ban đầu thông báo về việc phát hành lại httpClient.
- Tài liệu MSDN thực tế cho HttpClient.
- BingTransTableSample
- GoogleMapsSample
- WorldBankSample
Trong các bình luận của thông báo , có người đã hỏi nhân viên của Microsoft:
Sau khi kiểm tra các mẫu của bạn, tôi thấy rằng bạn đã không thực hiện hành động vứt bỏ trên ví dụ httpClient. Tôi đã sử dụng tất cả các phiên bản của HTTPClient bằng cách sử dụng câu lệnh trên ứng dụng của mình và tôi nghĩ rằng đó là cách đúng đắn vì HttpClient thực hiện giao diện IDis Dùng. Tôi có đang đi đúng hướng không?
Câu trả lời của anh là:
Nói chung là đúng mặc dù bạn phải cẩn thận với "bằng cách sử dụng" và không đồng bộ vì chúng không thực sự trộn lẫn trong .Net 4, Trong .Net 4.5, bạn có thể sử dụng "await" bên trong câu lệnh "bằng cách sử dụng".
Btw, bạn có thể sử dụng lại cùng một httpClient như nhiều lần [như] bạn thích vì vậy thông thường bạn sẽ không tạo / loại bỏ chúng mọi lúc.
Đoạn thứ hai là không cần thiết cho câu hỏi này, điều này không liên quan đến việc bạn có thể sử dụng một ví dụ httpClient bao nhiêu lần, nhưng về việc có cần thiết phải loại bỏ nó sau khi bạn không còn cần nó nữa.
(Cập nhật: trên thực tế, đoạn thứ hai là chìa khóa cho câu trả lời, như được cung cấp dưới đây bởi @DPeden.)
Vì vậy, câu hỏi của tôi là:
Có cần thiết không, với việc triển khai hiện tại (.NET Framework 4.5), để gọi Dispose () trên các phiên bản httpClient và HttpClientHandler? Làm rõ: bằng "cần thiết" Ý tôi là nếu có bất kỳ hậu quả tiêu cực nào đối với việc không xử lý, chẳng hạn như rò rỉ tài nguyên hoặc rủi ro tham nhũng dữ liệu.
Nếu không cần thiết, dù sao thì đó cũng là một "thông lệ tốt", vì họ đã triển khai IDis Dùng một lần?
Nếu cần thiết (hoặc được khuyến nghị), mã này được đề cập ở trên có triển khai an toàn không (đối với .NET Framework 4.5)?
Nếu các lớp này không yêu cầu gọi Dispose (), tại sao chúng được triển khai dưới dạng IDis Dùng?
Nếu họ yêu cầu hoặc nếu đó là một thông lệ được khuyến nghị, thì các ví dụ của Microsoft có gây hiểu nhầm hoặc không an toàn không?
Flush
một lần sau mỗi lần viết và ngoài sự bất tiện của việc tiếp tục giữ tài nguyên cơ bản lâu hơn mức cần thiết, điều gì sẽ không xảy ra cần thiết cho "hành vi đúng"?