2009-07-15 30 views
9

tôi có mã này:C#: Dừng một sợi sau khi một ngoại lệ

Thread t = new Thread(() => UpdateImage(origin)); 
t.Name = "UpdateImageThread"; 
t.Start(); 

Nếu phương pháp UpdateImage (gốc) ném một ngoại lệ, nó là cần thiết để ngăn chặn chủ đề hoặc nó sẽ được ngừng sau khi ngoại lệ?

Cảm ơn bạn!

Trả lời

16

Nếu UpdateImage ném ngoại lệ, có thể nó sẽ gỡ toàn bộ quá trình của bạn. Bất kỳ chủ đề nào nêu ra một ngoại lệ cấp cao chỉ ra một vấn đề lớn. Bạn nên quấn cái này, ví dụ bằng cách đặt try/catch xung quanh UpdateImage và làm điều gì đó phù hợp. Và vâng, nếu một ngoại lệ lên đầu của một thread, thread là chết:

Thread t = new Thread(() => { 
    try {UpdateImage(origin); } 
    catch (Exception ex) {Trace.WriteLine(ex);} 
}); 
t.Name = "UpdateImageThread"; 
t.Start(); 

(hoặc lựa chọn của bạn xử lý lỗi)

1

Chuỗi sẽ tự động chấm dứt khi bạn không xử lý ngoại lệ, cùng với phần còn lại của quy trình, giả sử bạn đang sử dụng .Net 2.0 trở lên (mà tôi cho rằng bạn là do cú pháp C# 3 trong câu hỏi) .

3

Trường hợp ngoại lệ sẽ không gây ra các chủ đề để ngăn chặn nếu nó là bị bắt ở đâu đó trong phương thức UpdateImage - trừ khi mệnh đề catch bắt đầu một cách rõ ràng từ phương thức.

Nếu nó được unhandeled, ứng dụng của bạn sẽ sụp đổ anyway - do đó gây ra chủ đề đến dừng lại;)

Tốt nhất là để đặt một khối try ... catch trong phương pháp UpdateImage bạn và thực hiện xử lý có lỗi logic của bạn Nơi nó thuộc về. Sau đó, bạn có thể quyết định thời tiết trở lại và kết thúc chuỗi hoặc thử lại

1

nó giống như chuỗi chính, ví dụ: nếu có ngoại lệ xảy ra trong chuỗi chính và bạn không bị bắt, do đó, chủ đề chính ' sẽ chấm dứt và ứng dụng của bạn.

Các điều tương tự cho chủ đề sử dụng

10

Kể từ .NET 2.0, khi một sợi nền ném một ngoại lệ (mà không được xử lý), bộ thực thi .NET sẽ đi xuống quá trình của bạn. Trong một ứng dụng Windows.Forms, điều này là khác nhau; bạn có thể sử dụng sự kiện Application.ThreadException để bắt ngoại lệ.

Điều này khác trong .NET 1.0/1.1, bạn có thể đọc về toàn bộ chủ đề tại đây (ví dụ: cách bật hành vi cũ với .NET 2.0 trở lên): http://msdn.microsoft.com/en-us/library/ms228965.aspx#ChangeFromPreviousVersions.

Bất kể bạn sử dụng Windows.Forms hay hành vi kế thừa - nếu quá trình không thoát, bạn không cần phải dừng luồng một cách rõ ràng; ngoại lệ sẽ dừng lại.

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