2011-08-25 24 views
7

Tôi nghe nói rằng nó là điều cần thiết để Vứt bỏ (hoặc Close) một WCF proxy client ngay cả khiTại sao nó quan trọng để xử lý/đóng một proxy client WCF

  • bạn không sử dụng phiên
  • không có các nguồn lực không được quản lý cần xác định dọn dẹp (ví dụ ổ cắm mở)

Ví dụ, khi sử dụng một BasicHttpBinding với cấu hình ràng buộc mặc định, điều này cần sử dụng tốt ngay cả trong một trang web phổ biến, phải không?

var clt = new MyServiceClient(); 
clt.PlaceOrder(foo); 
// no dispose 

hoặc

var clt = new ChannelFactory<IOrderService>().CreateChannel(); 
clt.PlaceOrder(foo); 

Cảm ơn

+9

Tôi cho rằng bạn _could_ để cho các GC làm điều đó cho bạn, nhưng đó chỉ là không sạch mã. Bạn tuyên bố nó, bạn giải phóng nó. Khái niệm cơ bản dường như không còn được dạy nữa. –

Trả lời

3

Tạo kênhFactory & Mở nó là một hoạt động tốn kém và bạn nên tránh thực hiện nó cho mọi cuộc gọi nếu bạn quan tâm đến hiệu suất.

Usecase đầu tiên của bạn không đúng ngay cả với basicHttpBinding vì nó có khả năng sẽ tạo ra một channelfactory mới cho mỗi lần lập tức. .NET 3.5 SP1 đã giới thiệu một số bộ nhớ đệm ChannelFactory để bạn có thể ổn trong một số trường hợp nhất định.

Trong lần sử dụng thứ hai của bạn, nếu bạn sử dụng bộ nhớ cache và xử lý lại, hãy nhớ rằng bạn/người triển khai của bạn có thể thay đổi thời gian triển khai và thiếu đóng/xử lý có thể có tác động lớn .

Tóm lại, luôn luôn an toàn khi đóng/vứt bỏ và đó là lý do tại sao MSDN đề xuất điều đó.

15

nó tốt thực hành để đóng điều (và vứt bỏ chúng) khi bạn đã hoàn tất với họ. (Bạn có để một luồng tệp mở ngay cả khi bạn đang đọc/ghi vào/từ nó?) Không, tôi có thể thấy một vài lý do:

  1. Máy chủ (có thể/sẽ) có giới hạn số lượng kết nối hoạt động mà nó duy trì. Càng sớm bạn vứt bỏ dịch vụ của mình, khách hàng tiếp theo càng sớm càng sẵn sàng sử dụng vị trí đó. (Tại sao phải chờ một thời gian chờ nếu bạn đang ở trong thực tế thông qua?)
  2. Tránh các chi phí dư thừa của một kết nối không hoạt động. Tài nguyên được cấp là "phong phú" những ngày này, nhưng chi phí ít hơn bạn giữ cho hiệu suất của bạn tốt hơn cuối cùng sẽ được.
  3. Bạn giảm nguy cơ lỗi/ngoại lệ do hết thời gian chờ bằng cách xử lý ứng dụng khách khi nó hết.
  4. Bằng cách đóng ứng dụng này khi bạn thực hiện xong việc lưu giữ nhật ký máy chủ một cách hiệu quả. Cuối cùng, ngay cả khi khách hàng không hiển thị nó, máy chủ có thể kết thúc với các ngoại lệ thời gian chờ hiển thị trong nhật ký do một kết nối không hoạt động mà không được chăm sóc khi họ cần phải có được.
  5. MSDN says to (Lưu ý dấu đầu dòng thứ 4 trong danh sách đối tượng khách hàng WCF).

Chỉ một vài lý do tôi có thể nghĩ ra khỏi đỉnh đầu.

+0

* Đóng * kết nối không giống như * Ngắt kết nối * của kết nối. –

+3

@Kirk: Đồng ý, nhưng cũng kiểm tra để đảm bảo không có lỗi nào hiện diện, nếu không, việc hủy bỏ sẽ được thực hiện. –

+0

một vài ghi chú - hệ thống tệp đại diện cho tài nguyên không được quản lý. Các proxy trong câu hỏi thì không. Câu hỏi thực sự là 'tại sao' và bởi vì nó gọn gàng hoặc bởi vì MSDN nói như vậy không phải là những gì tôi đang tìm kiếm. Bạn có nói rằng Vứt bỏ đóng một kết nối mở (ngay cả đối với basicHttpBinding) và đó là lý do tại sao bạn nên làm điều đó? thanks – ConfusedNoob

2

Nó thực sự phụ thuộc vào loại khách hàng. Ví dụ, nếu bạn viết một ứng dụng ASP.NET để gọi vào dịch vụ, thì tốt hơn là nên nhớ cache proxy vì việc tạo ra nó là tốn kém.Điều này đang được nói, một khi bạn đang thực hiện với bất kỳ tài nguyên IDisposable, bạn nên vứt bỏ nó để các đối tượng đang được xử lý được một cơ hội để phát hành các nguồn tài nguyên nó giữ trên để nó có thể được gỡ bỏ khỏi bộ nhớ. Nếu một đối tượng IDisposable có một phương thức Close, nó phải được gọi đầu tiên.

Một bài viết xuất sắc về đề tài hấp dẫn này có thể được tìm thấy ở đây: http://msdn.microsoft.com/en-us/magazine/bb985010.aspx

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