2011-10-16 45 views
6

Tôi tự hỏi nếu một tĩnh lớp trong một ASP.NET MVC ứng dụng có thể là khởi tạo nhiều hơn một lần. Ban đầu tôi đã thiết kế ứng dụng của mình để một thành phần tĩnh tìm nạp một số thứ từ cơ sở dữ liệu và phục vụ như một bộ nhớ đệm, và tôi đã thêm một phương thức làm mới vào lớp được gọi từ hàm tạo. Phương thức làm mới cũng được cung cấp thông qua phần quản trị của ứng dụng. Tại một số điểm, tôi nhận thấy rằng dữ liệu đã được cập nhật mà không yêu cầu kích hoạt thủ công, điều này ngụ ý rằng hàm tạo tĩnh chạy nhiều lần.lớp tĩnh trong ứng dụng Asp.NET MVC

Có một số tình huống mà tôi có thể thấy điều này xảy ra một cách hợp lý, chẳng hạn như Exception chưa được giải quyết gây ra việc khởi tạo lại. Nhưng tôi đang gặp rắc rối khi tái tạo điều này, vì vậy tôi muốn biết chắc chắn.

+1

Đảm bảo lớp học của bạn là ** hoàn toàn ** an toàn chỉ. – SLaks

Trả lời

10

Các kịch bản thông thường nhất sẽ là:

  • tải lại của ứng dụng web

    • chạm Web.config
    • chạm nhị phân
    • chấm dứt bất thường (out-of-bộ nhớ , lỗi quyền)
  • một tải lại Pool Application

  • khởi động lại IIS
  • khởi động lại w3wp.exe (ít nhất là một lần trong 29 giờ!)

Ứng dụng tên miền sẽ được tải lại (biên dịch lại các bộ phận động khi cần thiết) và điều này sẽ làm mất hiệu lực bất kỳ dữ liệu được khởi tạo tĩnh nào.

Bạn có thể khắc phục điều đó bằng cách duy trì dữ liệu tĩnh ở đâu đó nếu tạo giá đắt, hoặc tránh tải lại AppDomain, Hồ bơi ứng dụng hoặc máy chủ IIS.

Cập nhật: Phil Haack vừa công bố một blog entry liên quan ở đây: http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx

  • Bye Bye App miền
    • nó làm một công việc tốt hơn ở giải thích ở trên . Đáng chú ý, IIS sẽ tái chế nó là quá trình lao động rất 29 giờ ở mức tối thiểu và hosters chia sẻ sẽ tái chế AppDomain nhiều thường xuyên hơn (có lẽ trong 20 phút thời gian nhàn rỗi)
  • Vì vậy, nói với ASP.NET, “Hey, tôi là làm việc ở đây!”
    • phác thảo kỹ thuật mà bạn có thể áp dụng để có được thông báo về một AppDomain đi xuống - bạn có thể sử dụng này để có được dụ Singleton bạn có hành vi 'đúng'
  • Khuyến nghị

Tôi đề nghị bạn đọc nó :)

+0

Update_: Phil Haack vừa xuất bản một bài viết blog có liên quan tại đây: http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx . Tôi cập nhật câu trả lời để phản ánh thông tin lượm lặt – sehe

+1

Gần đây tôi phát hiện ra rằng sự cố của tôi là do tải lại thời gian chờ của Hồ bơi ứng dụng, được lên lịch để tiêu diệt các ứng dụng không hoạt động trong 20 phút trở lên. Đây là trên Windows Azure và [bài đăng này] (http://blog.smarx.com/posts/controlling-application-pool-idle-timeouts-in-windows-azure) đã giúp tôi giải quyết vấn đề của mình. – Gleno

4

static lớp học được khởi tạo một lần cho mỗi AppDomain.

Nếu IIS tái chế AppDomain của bạn, mọi thứ sẽ khởi tạo lại.

+0

IIS có thể tái chế AppDomain của tôi khi nó cảm thấy như vậy không? – Gleno

+0

Có; nó có thể và sẽ. Tôi tin rằng đây là một phần cấu hình. – SLaks

+0

Tôi đang sử dụng Azure, để trừu tượng hóa bản thân mình xa hơn với cấu hình IIS; nhưng điều này là tốt để biết. – Gleno

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