2011-10-02 29 views
38

Tôi không chắc chắn lý do tại sao điều này xảy ra và tôi không bao giờ hủy bỏ chủ đề một cách rõ ràng, do đó, nó có chút bất ngờ. Nhưng tôi đăng nhập Ngoại lệ và tôi thấy:Tại sao tôi nhận được "Chủ đề đã bị hủy bỏ" trong asp.net?

System.Threading.ThreadAbortException - Chủ đề đã bị hủy bỏ.

Điều này dường như xảy ra trong cuộc gọi đến System.Threading.WaitHandle.WaitOne. Tôi không chắc chắn cách xa ngoại lệ này đi. Tôi không nghĩ rằng chủ đề của tôi bao giờ chấm dứt bởi vì tôi bắt đăng nhập và nuốt lỗi.

Có ai biết tại sao tôi gặp phải các lỗi này không? Có lẽ đó là khi tôi buộc phải chấm dứt máy chủ của mình hoặc yêu cầu khởi động lại? Nếu nó không phải là sau đó những gì có thể gây ra chúng?

+0

Bạn có thể hiển thị mã bạn có trong Application_Start không? –

+0

@rick: Tôi không biết những gì bạn mong đợi để tìm thấy nhưng đây là một đoạn trích. 'var obj1 = new MyServiceObject(); srv1 = chủ đề mới (obj1.Queue); ... srv1.Start() '. Lưu ý rằng obj1 không nằm trong khối sử dụng nên nó không được xử lý sớm. Chỉ là một chủ đề đơn giản mà tôi sinh ra khi khởi động –

+0

'Thử' câu trả lời này .. http://stackoverflow.com/questions/20120800/system-threading-threadabortexception-on-generic-redirection/33999795#33999795 – Moumit

Trả lời

43

Nope, ThreadAbortException được ném bởi một đơn giản Response.Redirect

+1

hmm. Câu trả lời hay nhất +1 nhưng đó không phải là nó. Điều này thực sự xảy ra trên các chủ đề tôi sinh sản (thường là từ Application_Start) và không phải trên đường dẫn yêu cầu chính. –

+0

Đó chỉ là một cách để có được một ThreadAbortException - bạn làm cho nó âm thanh như đó là cách duy nhất. Ví dụ. cũng có thể là một yêu cầu mất> 90 giây vì vậy IIS đã giết nó. – saille

24

ASP.NET đẻ và giết chết nhân viên xử lý tất cả các thời gian khi cần thiết. Chủ đề của bạn chỉ có thể bị tắt bởi ASP.NET.

Cũ Trả lời:

Được biết đến vấn đề: PRB: ThreadAbortException Occurs If You Use Response.End, Response.Redirect, or Server.Transfer

Response.Redirect ("bla.aspx", false); 

hoặc

try 
{ 
    Response.Redirect("bla.aspx"); 
} 
catch (ThreadAbortException ex) 
{ 
} 
+0

hmm. Câu trả lời hay nhất +1 nhưng đó không phải là nó. Điều này thực sự xảy ra trên các chủ đề tôi sinh sản (thường là từ Application_Start) và không phải trên đường dẫn yêu cầu chính. –

+0

câu trả lời này đã giúp tôi! cảm ơn rất nhiều, tôi đã lãng phí quá nhiều thời gian cho vấn đề này – Lester

32

Nếu bạn đẻ trứng đề trong Application_Start, họ vẫn sẽ được thực hiện trong hồ bơi ứng dụng của AppDomain.

Nếu một ứng dụng không hoạt động trong một thời gian (nghĩa là không có yêu cầu), hoặc một số điều kiện khác được đáp ứng, ASP.NET sẽ tái chế toàn bộ AppDomain.

Khi điều đó xảy ra, bất kỳ chủ đề nào bạn bắt đầu từ đó AppDomain, bao gồm các chủ đề từ Application_Start, sẽ bị hủy bỏ.

Lots thêm về hồ bơi ứng dụng và tái chế trong câu hỏi này: What exactly is Appdomain recycling

Nếu bạn đang cố gắng để chạy một quá trình dài chạy trong IIS/ASP.NET, câu trả lời ngắn thường là "Đừng". Đó là những gì Windows Services dành cho.

+0

Điều đó nghe có vẻ giống như những gì đang xảy ra. Tôi có một câu hỏi khác ... Application_Start có chạy lại khi trang web này hoạt động trở lại không? Dường như nó không phải là (nhưng tôi có thể đã mã hóa một cái gì đó sai) –

+2

Nó không phải là. Từ đây: http://msdn.microsoft.com/en-us/library/ms178473.aspx "Các phương thức Application_Start và Application_End là các phương thức đặc biệt không đại diện cho các sự kiện HttpApplication. ASP.NET gọi chúng một lần cho toàn bộ thời gian của ứng dụng miền, không phải cho mỗi cá thể HttpApplication. " –

9

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

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

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

Truy cập this link để tải xuống ví dụ mẫu.

11

Đối với dịch vụ web được lưu trữ trong ASP.NET, tài sản cấu hình executionTimeout:

<configuration> <system.web> 

<httpRuntime executionTimeout="360" /> 

</system.web> 

</configuration> 

Set này và các chủ đề hủy bỏ ngoại lệ sẽ biến mất :)

+0

Tìm thấy điều này để khắc phục khi thực hiện cuộc gọi web không đồng bộ. – Jonny

+3

"Thiết lập điều này và các trường hợp ngoại lệ hủy bỏ sẽ biến mất" .. trong một vài phút;) – saille

+2

@saille 6 phút để được chính xác ... –

4

Lỗi này có thể được gây ra bởi cố gắng để kết thúc phản ứng nhiều hơn một lần. Vì các câu trả lời khác đã được đề cập, có nhiều phương pháp khác nhau sẽ kết thúc phản hồi (như Response.End hoặc Response.Redirect). Nếu bạn gọi nhiều hơn một liên tiếp, bạn sẽ nhận được lỗi này.

Tôi đã gặp lỗi này khi tôi cố gắng sử dụng Response.End sau khi sử dụng Response.TransmitFile dường như cũng kết thúc phản hồi.

+0

Tỷ lệ cược là, làm bất cứ điều gì với phản hồi sau khi nó đã kết thúc có thể dẫn đến lỗi này. – jahu

0

Tôi gặp lỗi này khi đã thực hiện Response.Redirect sau khi đăng nhập thành công của người dùng.

Thay vào đó, tôi đã sửa lỗi bằng cách thay thế FormsAuthentication.RedirectFromLoginPage.

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