2012-02-14 24 views
10

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ì?

+0

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. –

+0

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? –

+0

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

Trả lời

4

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:

  1. 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.

  2. 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.

+1

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

+2

Đú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

+0

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

17

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.

+0

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

+1

@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? –

+0

@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

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