2009-08-30 36 views
5

Tôi đang chạy một số chủ đề nền trong GUI. Hiện tại tôi đang thực hiện một mã hủy bỏ chủ đề cá nhân nhưng có tài sản IsBackground trong chủ đề và theo MSDN họ sẽ hủy bỏ chính mình.Tôi có thể yên tâm dựa vào IsBackground trong Chủ đề khi ứng dụng chấm dứt không?

Tôi biết rằng nó sẽ Thread.Abort() đó là khó chịu nhưng không có gì đi trong chủ đề nền này mà tôi cần phải giữ một trạng thái thích hợp hoặc yêu cầu làm sạch thích hợp.

Tôi đang cố tránh mọi sự cố nếu người dùng chỉ đóng ứng dụng ở giữa chuỗi nền. Vì các kịch bản đa luồng khá khó kiểm tra, tôi muốn đưa ra ý kiến ​​của bạn về chủ đề này.

Về cơ bản, thay vì lăn mã của riêng tôi, tôi chỉ cần đặt IsBackground = True và quên phần còn lại?

Trả lời

4

Thread.Abort ném một ngoại lệ, vì vậy nếu mã của bạn đã được viết chính xác để sử dụng cuối cùng/sử dụng, nó sẽ thất bại một cách duyên dáng và giải phóng tất cả các tài nguyên.

chỉnh sửa

tôi có lẽ nên cho một ít chi tiết hơn. Đầu tiên, ngoại lệ là kiểu ThreadAbortException. Điều thú vị là, ngay cả khi bạn bắt nó và không làm gì cả, nó cũng không biến mất. Nói cách khác, ngay sau khi nó rời khỏi khối catch của bạn, nó tiếp tục được ném. Điều này là để thực hành (thường là xấu) bắt ngoại lệ và nuốt nó không ngăn chặn các chủ đề bị hủy bỏ. Nếu bạn thực sự muốn dừng việc hủy bỏ, bạn cần phải nắm bắt ngoại lệ, sau đó gọi Thread.ResetAbort.

0

Tôi nghĩ điều này phụ thuộc vào tài nguyên. Ví dụ, ổ cắm được đóng an toàn khi quá trình kết thúc. Đối với một số tài nguyên, bạn nên phát hành nó trước khi thoát khỏi chuỗi.

5

Các MSDN page trên các tiểu bang IsBackground tài sản:

Một chủ đề hoặc là một sợi nền hoặc a thread foreground. Bối cảnh chủ đề giống hệt với tiền cảnh chủ đề, ngoại trừ nền chủ đề không ngăn chặn quá trình từ chấm dứt. Sau khi tất cả các tiền cảnh chủ đề thuộc về quá trình có bị chấm dứt, ngôn ngữ chung là thời gian chạy kết thúc quá trình. Bất kỳ chủ đề nền nào còn lại là đã dừng và không hoàn thành.

Vì vậy, điều đó có nghĩa là bạn phải làm cho luồng của bạn khá phòng thủ để đảm bảo rằng nó không để bất kỳ kết nối nào mở, cơ sở dữ liệu được viết một nửa vv. điều đó sẽ ngăn ứng dụng đóng cho đến khi hoàn thành.

5

Jonathan Greensted's post có một bản tóm tắt tốt về IsBackground:

Thuộc tính IsBackground cho phép bạn nói với thời gian chạy nếu thread là một foreground (UI) chủ đề hoặc một nền chủ đề. Theo mặc định, tất cả các chủ đề được tạo làm chủ đề nền trước trừ khi bạn thay đổi thuộc tính này.

Vậy tại sao chúng ta quan tâm?

Vâng, thời gian chạy .NET làm điều gì đó đặc biệt khi foreground cuối cùng chủ đề chấm dứt - nó hủy bỏ tất cả các chủ đề nền và chấm dứt việc áp dụng . (Chúng ta biết Thread.Abort là xấu tuy nhiên nếu ứng dụng là là shutdown anyway mà badness có một thời gian rất hạn chế.)

Nói một cách khác, là công việc đang thực hiện trong ok sợi nền dừng lại ở bất kỳ thời điểm nào khi ứng dụng đóng?

Nếu không thì nó có thể là một chuỗi tiền cảnh - vì vậy một chuỗi làm việc với các tập tin xử lý hoặc kết nối cơ sở dữ liệu mở lý tưởng là tiền cảnh nơi ứng dụng thoát sẽ đợi thread này kết thúc trước khi thoát.

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