Tôi có một chuỗi chứa thực thi tập lệnh IronPython. Đối với một số lý do tôi có thể cần phải dừng thread này bất cứ lúc nào, bao gồm cả thực thi kịch bản. Làm thế nào để đạt được điều này? Ý tưởng đầu tiên là Thread.Abort()
, nhưng nó được biết đến là ác ...Cách an toàn để ngăn chặn một chuỗi đang chạy là gì?
Trả lời
Vâng từ bạn câu hỏi và ý kiến tiếp theo tôi có thể đề nghị bạn hai lựa chọn, với một số "cảnh báo" thêm:
Nếu chủ đề của bạn loops thực hiện một cái gì đó trên mỗi lần lặp, bạn có thể đặt một lá cờ boolean dễ bay hơi như vậy mà nó thoát ra sau khi kết thúc lần lặp hiện tại (giả vì tôi không quen thuộc với python):
while shouldExit = false // do stuff
sau đó chỉ cần thiết lập các cờ để
true
khi bạn muốn thread dừng lại và nó sẽ dừng lại trong lần kiểm tra điều kiện tiếp theo.Nếu bạn không thể chờ kết thúc và cần dừng lại ngay lập tức, bạn có thể đi theo số
Thread.Abort
, nhưng hãy chắc chắn rằng không có cách nào để bạn có thể giữ các tệp, ổ cắm, ổ khóa hoặc bất cứ thứ gì khác như điều này trong trạng thái không nhất quán.
Giải pháp đầu tiên là hiển nhiên, nhưng nó không phải cho trường hợp của tôi. Tôi sợ sử dụng 'Thread.Abort()', bởi vì ở khắp mọi nơi mọi người viết một cái gì đó như "KHÔNG BAO GIỜ SỬ DỤNG IT !!!"))). Nhưng bây giờ tôi sử dụng nó trong chương trình - xử lý ho có thể ở lại mở ra. – aplavin
Đúng là phần lớn thời gian là xấu, nhưng đặc biệt vì mọi người có xu hướng sử dụng các luồng cho I/O hoặc những thứ khác như thế này sẽ bị bỏ lại trong trạng thái không nhất quán nếu chuỗi bị giết. Nếu bạn không sử dụng thread cho bất cứ điều gì như thế này thì nó hoàn toàn an toàn. – Tudor
Và là nó đảm bảo, rằng thread với các mã như này 'try {// làm việc - không thử/catches đây } catch (ThreadAbortException) {// đăng nhập exit }' sẽ được dừng lại sau khi gọi ' Abort() 'trên đó? – aplavin
Cách an toàn để ngăn chặn chuỗi đang chạy là gì?
Đặt luồng theo quy trình riêng. Khi bạn muốn dừng lại, sẽ hủy quá trình.
Đó là cách duy nhất an toàn cách để xóa chuỗi. Hủy bỏ một chủ đề có thể làm mất ổn định nghiêm trọng một quá trình và mất dữ liệu người dùng. Không có cách nào để tránh tình huống "mất dữ liệu người dùng" nếu bạn thực sự, thực sự cần phải có thể giết một sợi có thể làm bất cứ điều gì. Cách duy nhất để tránh làm mất ổn định quá trình kêu gọi hủy bỏ là làm cho chúng trở thành các quy trình khác nhau hoàn toàn.
Trong trường hợp của tôi không có cách nào để mã thread gây mất ổn định toàn bộ quá trình. Nhưng đối với kiến thức chung - bằng cách tạo ra các quy trình khác nhau, bạn có nghĩa là có hai dự án được biên dịch cho các assembly khác nhau và một trong số chúng chạy một chương trình khác? Hay cái gì? – aplavin
@chersanya: Bạn có vẻ chắc chắn về bản thân mình. Bạn đang chạy một kịch bản; làm thế nào để bạn biết rằng tác giả của kịch bản đã không đặt mã trong đó sẽ làm mất ổn định quá trình hoặc mất dữ liệu người dùng khi bị gián đoạn? –
@chersanya các quy trình khác nhau không nhất thiết phải chạy các assembly khác nhau. Ví dụ, 'myprogram.exe' có thể bắt đầu một tiến trình mới đang chạy' myprogram.exe'. – phoog
- 1. Có an toàn khi sử dụng cờ boolean để ngăn chặn một luồng chạy trong C#
- 2. Cách an toàn nhất để chạy một tệp thực thi trên Linux là gì?
- 3. cách tốt nhất và an toàn trên Android để ngăn chặn chủ đề
- 4. CScript/WScript Ngăn chặn một lỗi đang bị chặn
- 5. Là chuỗi String.intern() an toàn
- 6. Cách tốt nhất để ngăn chặn quá trình Unicorn Server chạy là gì?
- 7. Cách tốt nhất để tìm mã đang chặn chuỗi chính của bạn là gì?
- 8. Sử dụng 'HttpContext.Current.Cache' một cách an toàn
- 9. là chuỗi java.util.UUID có an toàn không?
- 10. Định tuyến an toàn là gì?
- 11. msdn: "An toàn chủ đề" là gì?
- 12. Tại sao an toàn để ngăn chặn cảnh báo không được kiểm soát này?
- 13. Cách tốt nhất để trả lại IDisposables được xây dựng một cách an toàn là gì?
- 14. Loại an toàn trong .net là gì?
- 15. Chuỗi NSUserDefault có an toàn không?
- 16. Tạm dừng nhiệm vụ chạy dài một cách an toàn
- 17. Ngăn xếp C++ an toàn Chủ đề
- 18. Cách an toàn để tăng thêm một int trong bản mở rộng mẫu variadic là gì?
- 19. Cấu hình Devise an toàn nhất có thể là gì?
- 20. Cách an toàn và dễ dàng để xóa một thư mục trong Ruby là gì?
- 21. tạo std :: chuỗi từ char * một cách an toàn
- 22. Chuỗi an toàn của Netty Channel.write có an toàn không?
- 23. Có an toàn để biên dịch lại tệp thi hành trong khi nó đang chạy không?
- 24. Cách đánh dấu một hội đồng .net là an toàn?
- 25. Cách an toàn nhất để nhúng mật khẩu bên trong mã Java là gì?
- 26. "Nhập an toàn" có nghĩa là gì trong Python?
- 27. GID Chế độ an toàn PHP là gì?
- 28. Có an toàn để mã hóa chuỗi bằng cách sử dụng cùng một chuỗi là khóa không?
- 29. Cách tốt nhất để lưu điểm cao trên iPhone để ngăn chặn tấn công là gì?
- 30. Là "AutoParameterizationWebConfigConnectionStrings" -option cách duy nhất để ngăn chặn tokenization chuỗi kết nối?
Có, giật tấm thảm ra khỏi một sợi chỉ là điều ác. Nhưng nếu đó là những gì bạn muốn làm, sau đó 'Thread.Abort()' là con đường để đi. Giải pháp tốt hơn là sửa đổi thiết kế của ứng dụng của bạn. –
Vòng lặp luồng của bạn hay nó chỉ chạy để thực hiện một tập lệnh duy nhất và sau đó chết? –
Nó lặp lại, nhưng mỗi lần lặp lại chứa thực thi tập lệnh, có thể khá dài. – aplavin