Việc sử dụng IHttpHandler.IsReusable là gì?


104

Tôi đang viết một IHttpHandlervà tôi sẽ cần triển khai một thuộc IsReusabletính. Khi tôi xem tài liệu MSDN, nó nói:

Nhận một giá trị cho biết liệu một yêu cầu khác có thể sử dụng cá thể IHttpHandler hay không.

Điều này không hữu ích lắm. Tôi nên sử dụng trình xử lý có thể tái sử dụng trong những trường hợp nào và trong những trường hợp nào thì không nên sử dụng lại?

Câu hỏi tiếp theo:

  1. Tái sử dụng là gì?
  2. Tôi có thể duy trì trạng thái (tức là các biến lớp) khi nào Reusable = true??


"Tái sử dụng" có nghĩa là xử lý nhiều hơn một yêu cầu với một phiên bản cụ thể của trình xử lý. Bạn có thể lưu trữ bất kỳ thứ gì trong Session - nó sẽ không bị ảnh hưởng khi phiên bản của trình xử lý được phát hành.
AilenChieftain

@IrishChieftain Nó giống như .Net giữ một túi các HttpHandlers được khởi tạo, chọn một cái và chỉ cung cấp cho nó một ngữ cảnh?
Kees C. Bakker

1
@IrishChieftain ngay bây giờ tôi đang sử dụng nó cho một trình phát đơn giản của một số thông tin nhật ký. Nhưng tôi đang cố gắng tìm hiểu ý nghĩa là gì để hiểu khi nào và cách sử dụng IHttpHandlers. Chúng là một tính năng bị lãng quên bởi nhiều người.
Kees C. Bakker

Câu trả lời:


93

Thuộc tính này cho biết liệu nhiều yêu cầu có thể được xử lý với cùng một phiên bản IHttpHandler hay không. Theo mặc định, ở cuối đường dẫn yêu cầu, tất cả các trình xử lý http được đặt trong handlerRecycleList của HttpApplication được đặt thành null. Nếu một trình xử lý có thể sử dụng lại, nó sẽ không được đặt thành null và thể hiện sẽ được sử dụng lại trong yêu cầu tiếp theo.

Lợi ích chính là hiệu suất vì sẽ có ít đối tượng hơn để thu gom rác.
Điểm đau quan trọng nhất đối với trình xử lý có thể tái sử dụng là nó phải an toàn về chỉ số. Điều này không phải là tầm thường và cần một số nỗ lực.

Cá nhân tôi khuyên bạn nên để giá trị mặc định (không thể sử dụng lại) nếu bạn chỉ sử dụng tài nguyên được quản lý vì Trình thu gom rác sẽ dễ dàng xử lý chúng. Hiệu suất đạt được từ các trình xử lý có thể tái sử dụng thường không đáng kể so với nguy cơ tạo ra các lỗi phân luồng khó tìm.

Nếu bạn quyết định sử dụng lại trình xử lý, bạn nên tránh duy trì trạng thái trong các biến lớp vì nếu thể hiện trình xử lý được truy cập đồng thời, nhiều yêu cầu sẽ ghi / đọc các giá trị.


1
Khuyến nghị cuối cùng của bạn để tránh duy trì trạng thái trong các biến lớp hơi khó hiểu. Giả sử bạn đặt IsReusable thành false, thì sẽ không có khả năng có một yêu cầu khác (đồng thời hoặc không) truy cập vào cùng một phiên bản của HttpHandler đó, và do đó việc duy trì trạng thái trong các biến lớp sẽ an toàn?
Ben Amada

2
Chắc chắn rồi. Tôi đã diễn đạt lại khuyến nghị cuối cùng nhấn mạnh rằng nó chỉ có thể áp dụng nếu IHttpHandler được sử dụng lại. Cảm ơn vì đã làm rõ, Ben!
Branislav Abadjimarinov 15/12/12

7
Đối với những gì nó có giá trị, tôi đã thực hiện nhiều, rất nhiều IHttpHandlers với IsReusablecác thiết lập để truevà đã không có vấn đề. Điều chính cần ghi nhớ là không có bất kỳ biến nào trong phạm vi lớp, mà hãy sử dụng các biến cục bộ trong các hàm của bạn.
dana

6
Lời giải thích tuyệt vời. Rõ ràng và chính xác. Tôi ước các bài báo MSDN ngắn gọn như thế này.
AlexVPerl

1
@Branislav - Nếu tôi hiểu câu trả lời của bạn đúng. Không chỉ các luồng khác nhau có thể sử dụng đồng thời các trường hợp khác nhau của trình xử lý mà còn có thể cho các luồng khác nhau thực hiện đồng thời phiên bản SAME của trình xử lý?
Ian

11

Rõ ràng, điều này giữ cho trình xử lý trong bộ nhớ và có thể xử lý nhiều yêu cầu. Khi được đặt thành false, nó phải tạo một phiên bản mới của trình xử lý cho mỗi yêu cầu đến.

Dưới đây là một câu hỏi cho thấy điều gì sẽ xảy ra khi nó không được sử dụng đúng cách:

Truyền trực tuyến hình ảnh dựa trên dữ liệu bằng HttpHandler


Bạn có một số tài liệu hỗ trợ câu trả lời của bạn?
Kees C. Bakker

4
Cũng giống như bạn tôi có thể tìm thấy không có giấy tờ thỏa đáng trên MSDN vì vậy tôi đã phải kiểm tra tải hình ảnh từ một cơ sở dữ liệu đến một trang của một trang web thương mại điện tử, và sau đó quan sát những gì xảy ra :)
IrishChieftain

5

Việc tái chế trình xử lý sẽ rẻ hơn so với tái chế trình xử lý mới mỗi khi có yêu cầu và máy chủ sẽ chiếm ít bộ nhớ hơn, giảm bớt công việc mà GC phải thực hiện. Nếu trình xử lý ở trạng thái mà việc xử lý một yêu cầu mới sẽ không gặp vấn đề (tức là bất kỳ trạng thái nào trong thể hiện trình xử lý đã được đặt lại) , thì nó sẽ đủ điều kiện là có thể sử dụng lại.

BIÊN TẬP

Tôi không chắc liệu câu trả lời của mình có xác định đúng cách sử dụng lại hay không. Nó thực sự cho phép tái sử dụng đồng thời, vì vậy trạng thái hiệu quả sẽ được tránh tốt nhất hoặc được quản lý cẩn thận theo cách an toàn luồng.


Tôi cũng sẽ nghĩ như vậy. Bạn nói đúng, câu hỏi thực tế (cơ bản) là: 'tái sử dụng là gì?'
Kees C. Bakker
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.