2009-09-16 33 views
30

Tôi đang sử dụng Server.Transfer. Tất cả mọi thứ hoạt động tốt, nhưng ngoại lệ đăng nhập cho thấy ngoại lệ sau đây.Chủ đề đã bị hủy bỏ

System.Threading.ThreadAbortException: Thread was being aborted. 
    at System.Threading.Thread.AbortInternal() 
    at System.Threading.Thread.Abort(Object stateInfo) 
    at System.Web.HttpResponse.End() 
    at System.Web.HttpServerUtility.Transfer(String path, Boolean preserveForm) 
    at System.Web.HttpServerUtility.Transfer(String path) 

Bất kỳ ý tưởng nào để tránh ngoại lệ trên.

Trả lời

38

Trường hợp ngoại lệ này được thực hiện bằng cách gọi đến số Server.Transfer để tạm dừng thực hiện phương pháp hiện tại - chính xác điều tương tự sẽ bị hủy nếu bạn thực hiện Response.Redirect.

Hai lựa chọn bạn đã bao gồm:

  • Catch và rethrow các ThreadAbortException/reperform các Server.Transfer
  • Hãy chắc chắn rằng bạn chỉ làm Server.Transfer ở những nơi nơi mà nó sẽ không bị bắt (khuyến khích)

EDIT: Scratch rằng, http://support.microsoft.com/kb/312629 có một vài đề xuất khác để thử nhưng tôi vẫn khuyên bạn nên # 2 ở trên.

+0

http://programming360.blogspot.com/2009/10/thread-was-being-aborted.html –

8

Caling Server.Transfer sẽ gọi Response.End luôn đưa ra một ThreadAbortException. Đây là một ngoại lệ "đặc biệt" vì trong khi nó có thể bị bắt trong một khối catch, nó sẽ luôn được ném lại ở cuối khối catch. Tôi sẽ có lỗi đăng nhập của bạn bỏ qua ThreadAbortExceptions.

+0

Nó có ý nghĩa với tôi rằng Server.Transfer sẽ gọi Response.End ngầm. Bạn có ý nghĩa gì khi ghi nhật ký lỗi bỏ qua threadAbortException. –

+4

Nếu bạn đang đăng nhập ngoại lệ cho một hệ thống ghi nhật ký bền vững, tôi sẽ lọc ra ThreadAbortExceptions hoặc có các báo cáo của bạn truy vấn hệ thống đăng nhập này lọc chúng ra. –

+0

Có nghĩa là ngoại lệ này không nghiêm trọng, do đó tôi có thể bỏ qua nó bằng cách lọc ra .. cảm ơn bạn. –

8

Sự cố này xảy ra trong các phương thức Response.Redirect và Server.Transfer vì cả hai phương thức đều gọi Response.End trong nội bộ.

Giải pháp cho vấn đề này như sau.

Đối với Server.Transfer, sử dụng phương thức Server.Execute thay thế.

Truy cập liên kết này để tải xuống ví dụ mẫu. http://jayeshsorathia.blogspot.com/2012/03/thread-was-being-aborted-error-occured.html

8

Một cách khác để giải quyết việc này, là để bắt lỗi được tạo ra và không rethrow nó:

 catch (ThreadAbortException) 
     { 
     } 
+1

sản phẩm khai thác sản phẩm nào là *** xấu *** – Rob

+3

@Rob, thông thường, nhưng không phải lúc nào. – Holf

0

Thay Response.End() Với HttpContext.Current.ApplicationInstance.CompleteRequest();

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