Tất cả các bài viết trên Internet nói rằng việc sử dụng Thread.Abort
là điều xấu (vì các nguyên tắc đồng bộ hóa thuộc về hệ điều hành và quá trình không chấm dứt, và nguyên thủy có thể vẫn bị khóa sau khi hủy bỏ chuỗi). Các nhà phát triển khuyên nên chấm dứt toàn bộ quy trình thay vì, bởi vì hệ điều hành sẽ tự do đồng bộ hóa nguyên thủy khi quá trình dừng lại.Các lớp đồng bộ hóa mỏng cho mỗi AppDomain hoặc cho mỗi Process?
AppDomain
trợ giúp dỡ hàng, Nếu ai sẽ sử dụngSlim
nguyên gốc đồng bộ hóa? (Với .net 4.0 một số lớp mới đã được thêm vào liên quan đến luồng:ManualResetEventSlim
,SemaphoreSlim
,ReaderWriterLockSlim
).Tài liệu nói rằng những nguyên thủy này không thể được sử dụng cho các quy trình khác nhau, vì mã thực thi nguyên thủy được quản lý hoàn toàn. Nhưng tôi không hiểu - những nguyên thủy này có hoạt động thông qua biên giới
AppDomain
hay không. (xem Can't set synchronization context when using appdomains)- Nếu có, họ làm như thế nào? Nếu không, thì tại sao tài liệu bỏ qua giới hạn này?
UPD: Tất cả mã của tôi đều được tôi tin cậy, bao gồm mã bên trong tên miền mà tôi tải. Tôi không muốn rời khỏi chuỗi hoạt động, khi đến lúc chấm dứt nó. Tôi muốn chấm dứt (hủy bỏ) chủ đề thay vì "thiết lập cờ" và "làm cho kiến trúc đẹp". Nếu nó là cần thiết để tạo thêm thread đầu tiên (tôi nghĩ rằng điều này là cần thiết lúc bắt đầu xử lý nền trong tên miền riêng biệt để tạo thêm một sợi), tôi sẽ làm. Tôi không muốn sử dụng "thiết lập cờ" phương pháp tiếp cận, bởi vì nó đòi hỏi tôi để thuật toán nền cụ với cờ kiểm tra, tôi không nên, đó là thời gian chạy hoặc trình biên dịch nên tự động hóa thiết bị cho tôi. Ngay bây giờ không có công cụ như vậy, đó là lý do tại sao tôi đang cố gắng áp dụng cách tiếp cận với việc dỡ miền.
Thêm kiểm tra giữa mỗi lệnh (hoặc trong chu kỳ lồng nhau sâu) sẽ làm chậm mã đáng kể. Việc thêm séc vào các vị trí ngẫu nhiên sẽ không đảm bảo việc chấm dứt nhanh chóng. Nếu khó khăn trong việc viết mã an toàn có thể được giải quyết, tại sao không cố gắng hủy bỏ các chủ đề và dỡ bỏ tên miền?
Bạn sẽ nhận được chúng thông qua ranh giới AppDomain như thế nào? Chúng không được tuần tự hóa, cũng như chúng không kế thừa từ 'MarshalByRefObject'. –
AppDomain giải quyết vấn đề này. Nhưng việc sử dụng đồng bộ hóa nguyên gốc trên các miền ứng dụng không thể hoạt động, bạn phải có khả năng vứt bỏ mọi thứ *. –
Có nhiều vấn đề hơn với 'Thread.Abort' hơn những gì bạn đã đề cập (trên thực tế, một số nguyên thủy đồng bộ hóa được phát hành tốt với' Thread.Abort'; với điều kiện là thread thực sự chết). Câu hỏi là, tại sao bạn đang cố gắng sử dụng phá thai tích cực thay vì hủy hợp tác? Chỉ cần gửi tín hiệu và để chủ đề quyết định khi nào an toàn để hủy. Viết mã abort-an toàn là khó khăn hơn nhiều so với mã chỉ an toàn chỉ - cho cả tài nguyên được quản lý và nguồn gốc. – Luaan