2013-04-26 38 views
7

Tôi đang sử dụng để kiểm tra điều kiện của một sợi với if(Thread.IsAlive). Biểu mẫu đang chạy trong chuỗi này. Đôi khi trong quá trình thực hiện, mặc dù biểu mẫu vẫn mở, cuộc gọi tới Thread.IsAlive dường như được đánh giá là sai. Tôi nghĩ để thực hiện kiểm tra tương tự với if(Thread.ThreadState==ThreadState.Running). Có đúng cách để làm không? Nếu không, công việc có thể xung quanh là gì?Thread.IsAlive and Thread.ThreadState == ThreadState.Running

+0

@daveL: ngay cả khi tôi ghét nó khi tôi nói nó có vẻ cư xử như thế này. Nhưng vấn đề là tôi có thể thấy biểu mẫu đang chạy trên luồng đó trên màn hình của tôi, nhưng mã thread.isalive không được thực thi. –

+1

Có vẻ như @ daveL có một thời gian khó khăn đối phó với sự mơ hồ, ít nhất nó có vẻ như vậy ...: p – kingdango

Trả lời

11

msdn Thread.IsAlive Property đúng nếu chủ đề này đã được bắt đầu và chưa chấm dứt bình thường hoặc bị hủy bỏ; ngược lại, sai.

msdn Thread.ThreadState

  • Chạy
    Các chủ đề đã bắt đầu, nó không bị chặn, và không có ThreadAbortException chờ giải quyết.
  • StopRequested
  • SuspendRequested
  • nền
  • Unstarted
  • WaitSleepJoin
  • Bị treo
  • AbortRequested

Tôi nghĩ rằng bây giờ nó rõ ràng Running là không giống như IsAlive

+2

IsAlive là chủ yếu hữu ích khi bạn đang bắt đầu một sợi. if (! thread.IsAlive) thread.Start(); Đây không phải là một cách an toàn để xem liệu một chuỗi có chạy không vì có nhiều trạng thái giữa NOT STARTED và STARTED không bằng RUNNING. IsAlive thực sự chỉ bảo bạn đừng cố bắt đầu lại. – kingdango

+3

Đây có phải là cách an toàn để kiểm tra định kỳ để đảm bảo luồng chưa thoát? –

+0

Bị tạm ngưng dường như không còn là một chuỗi tuyến tính hợp lệ nữa. Bất cứ ai có thể giới thiệu một sự thay thế? – user2924019