2012-06-20 33 views
8

Ứng dụng ASP.NET phải xử lý các ngoại lệ chưa được xử lý đang xảy ra trên một chuỗi nền không yêu cầu (do lỗi)?Làm thế nào để xử lý unhandled thread-ngoại lệ trong ASP.NET?

Theo mặc định, các ngoại lệ như vậy làm cho quá trình chấm dứt. Điều này là không thể chấp nhận được trong cài đặt của một quy trình công nhân ASP.NET vì yêu cầu đồng thời chạy bị hủy bỏ không thể đoán trước. Nó cũng là một vấn đề hiệu suất.

Trường hợp ngoại lệ trên chuỗi yêu cầu không phải là vấn đề vì ASP.NET xử lý chúng (bằng cách hiển thị trang lỗi).

Sự kiện AppDomain.UnhandledException cho phép quan sát thấy một ngoại lệ đã xảy ra, nhưng không thể ngăn chặn việc chấm dứt tại thời điểm đó.

Dưới đây là bản repro cần được dán vào mã trang của ASPX.

protected void Page_Load(object sender, EventArgs e) 
{ 
    var thread = new Thread(() => 
     { 
      throw new InvalidOperationException("some failure on a helper thread"); 
     }); 
    thread.Start(); 
    thread.Join(); 
} 

Giải pháp duy nhất tôi biết là không bao giờ để ngoại lệ "thoát" được giải quyết. Có giải pháp nào khác, toàn cầu hơn và toàn diện hơn cho việc này không?

+0

Tôi đang gặp phải vấn đề tương tự ... lạ như thế nào nhóm asp.net không bao giờ được coi là giải pháp cho điều này.Tôi có một mô-đun http phần thứ ba là không tại một số điểm và ném ngoại lệ mà gây ra quá trình công nhân để hiển thị "Dịch vụ không có sẵn" !!! –

Trả lời

0

Rx (Lập trình phản ứng) được sinh ra để giải quyết vấn đề như thế này, cố gắng xem xét thay đổi khuôn khổ bạn đang sử dụng và thay thế bằng Rx

http://msdn.microsoft.com/en-us/data/gg577609.aspx

Các gói Nugget:

https://nuget.org/packages/Rx-Main/1.0.11226

Đây là mã Rx tương đương:

 var o = Observable.Start(() => { throw new NotImplementedException(); }); 

     o.Subscribe(
      onNext => { }, 
      onError => { }, 
      () => { Console.WriteLine("Operation done"); }); 

Như bạn có thể thấy lỗi sẽ không thoát khỏi sợi nền khi bạn chỉ định một handler cho các lỗi, onError => { }

Nếu bạn không chỉ định một xử lý lỗi, ngoại trừ sẽ được tuyên truyền:

 o.Subscribe(
      onNext => { }, 
      () => { Console.WriteLine("Operation done"); }); 

trong ví dụ trên, ngoại trừ sẽ được tuyên truyền và sẽ gây ra những vấn đề tương tự như mã đăng của bạn

+0

Tôi đang thực hiện luồng trong ngữ cảnh mà tôi không xử lý các luồng sự kiện. Không chắc chắn nếu Rx là một phù hợp tốt ở đây. – usr

+0

Vâng, Rx là nhiều hơn là chỉ đối phó với dòng sự kiện, đó là mục tiêu chính nhưng khung đã phát triển và biết nó có chứa một API phong phú để đối phó với các phương pháp async. Lý do duy nhất tôi sẽ không khuyên bạn nên Rx ** chưa **, là nếu bạn chạy chủ đề nền của bạn song song, ngay cả khi Rx cung cấp một API cho điều này, tôi đã thấy rằng tốt hơn là sử dụng đối tượng 'Task' – Jupaol

0

bạn có thể đánh dấu các ngoại lệ như xử lý trong một trình xử lý ngoại lệ unhandled. https://msdn.microsoft.com/en-us/library/system.windows.applicationunhandledexceptioneventargs.handled(v=vs.95)

Điều đó sẽ ngăn không cho quy trình công nhân tái chế do lỗi trên chuỗi nền.

Tuy nhiên, bạn sẽ không thực hiện điều đó cho tất cả các ngoại lệ. Chỉ những người bạn biết là an toàn để bỏ qua.

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