2011-07-25 29 views
5

Tôi cần phải chấm dứt chuỗi bị cố định, tôi đặt IsBackground là true nhưng nó vẫn hoạt động. tính Chủ đề của:Giết chủ đề, thực sự!

ThreadState = AbortRequested

IsBackground = true

Khi tôi kiểm tra tại chỗ đông lạnh tôi tìm thấy những dòng dưới đây:

resultDetect = Detect(input, ref output); 

Các vị trí là một bên thứ 3 mã (Phương pháp phát hiện). Chủ đề chỉ cập nhật kết quảKích hoạt như bạn thấy. Tôi cần phải hủy bỏ chủ đề đó và bắt đầu lại một chủ đề mới để tiếp tục. Nếu không, ứng dụng sẽ đợi và không thực hiện kết quả nào -freshDetect cần thiết-

Làm thế nào tôi có thể tiêu diệt chuỗi không chết?

Trả lời

4

Chỉ có một cách để tiêu diệt một chuỗi treo an toàn trong ứng dụng của bạn: Environment.Exit Và thậm chí có thể thất bại nếu luồng đang chạy mã hạt nhân.

Tốt nhất là không nên sử dụng mã của bên thứ ba bị treo. Nếu bạn không có sự lựa chọn, sau đó chạy nó trong một quá trình riêng biệt.

+0

Đây đã là phía máy chủ của mã. Phương pháp quét một lượng lớn dữ liệu (~ 1GB RAM). Làm thế nào tôi có thể bắt đầu một quy trình mới theo cách siêu nhanh? Nói rằng tôi sẽ chia phía máy chủ thành phần cơ sở/bộ nhớ và phần quét ... Vì vậy, tôi có thể giết phần quét. Tôi nghĩ tôi sẽ hỏi một câu hỏi mới. –

+1

@Nime: Không có đủ chi tiết để tiếp tục, nhưng tôi sẽ đề cập đến ['MemoryMappedFile'] (http://msdn.microsoft.com/en-us/library/system.io.memorymappedfiles.memorymappedfile. aspx) cho phép chia sẻ bộ nhớ giữa các quá trình, vì vậy đây là một cách nhanh chóng để cung cấp cho quá trình quét truy cập chỉ đọc vào một mâm dữ liệu trong khi vẫn có thể giết nó độc lập với quy trình chính. –

2

Nếu chuyển đổi thành mã không được quản lý thì CLR sẽ trì hoãn việc tiêm ThreadAbortException cho đến khi nó trở về. Hành vi này đã thay đổi trong .NET 2.0 để làm cho chuỗi bị hủy bỏ an toàn hơn rất nhiều. CLR đang cố gắng hết sức để bảo vệ bạn khỏi bị hỏng trạng thái của quá trình rất có thể xảy ra trong trường hợp mã không được quản lý vì bạn không nhận được lợi ích của việc tách biệt miền ứng dụng có thể dễ dàng tải xuống trong một kịch bản được quản lý . Thực sự, giải pháp duy nhất là chạy API này trong một quá trình riêng biệt và sử dụng WCF, remoting, vv để giao tiếp với nó.

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