2011-07-05 29 views
8

Tôi tạo một chủ đề mới và khởi động nó từ một chuỗi chính.Cách bắt đầu chủ đề đã dừng

m_MyThread = new Thread(HandleMyThread); 
m_MyThread.IsBackground = true; 
m_MyThread.Start(); 

private void HandleMyThread() 
{ 
    while (true) 
    { 
     Thread.Sleep(5000); 
     return; 
    } 
} 

Sau 5 giây, chủ đề này sẽ kết thúc và ThreadState của nó bị dừng. Tôi muốn bắt đầu lại khi người dùng nhấp vào nút nhưng tôi nhận được một số ThreadStateException (Thread is running or terminated; it cannot restart):

private void button1_Click(object sender, EventArgs e) 
{ 
    m_MyThread.Start(); // ->raise exception 
} 

Vui lòng giúp tôi cách khởi động lại chuỗi đã dừng. Cảm ơn.

+1

Để biết thêm thông tin để ngăn chặn một chuỗi tìm câu hỏi của tôi: [Cách thích hợp để dừng công việc luồng] (http://stackoverflow.com/questions/5146186/proper-way-to-stop-a-threaded- job-forced) – Gerard

Trả lời

2

Nếu bạn muốn sử dụng lại chuỗi mà không cần phải tạo chuỗi mới mỗi lần, bạn có thể xem xét việc triển khai nhóm luồng.

+0

Nhưng theo 2 cách, cách tốt nhất là vì tôi muốn sử dụng lại luồng. Hãy cho tôi biết những ưu điểm và nhược điểm trong 2 cách. –

1

Chỉ cần tạo một chuỗi mới giống như bạn đã tạo khi tạo chuỗi ban đầu. Bạn cũng có thể muốn kéo nó ra thành một phương pháp để tránh lặp lại chính mình.

3

Sử dụng ManualResetEvent và thay vì Thread.Sleep, hãy đợi sự kiện hết thời gian chờ.

Sau đó, bất kỳ chủ đề nào khác có thể kích hoạt sự kiện và ngay lập tức tiếp tục chuỗi đang ngủ.

Khi đã thoát một chuỗi, chuỗi đó không thể chạy nữa. Vì vậy, đừng để nó thoát ra. Thay vào đó, đặt nó trở lại giấc ngủ chờ đợi một sự kiện.

+0

Tôi gặp sự cố trong đơn đăng ký của mình. Khi tôi chạy ứng dụng của mình, tôi cần phải tạo một luồng ngủ đến 8h sáng tới để nâng cao một sự kiện. Xin vui lòng cho tôi cách để giải quyết. Hiện tại, tôi tạo một chuỗi và tính tổng số mili giây từ nay đến 8 giờ sáng để nó sẽ ngủ trong khoảng thời gian này. Sau khi ngủ xong, nó sẽ gây ra một sự kiện. Bạn có bất kỳ lý tưởng về cách của tôi? Cảm ơn. –

8

Tôi biết câu hỏi này hơi cũ, nhưng tôi nghĩ tôi sẽ đăng câu trả lời trong trường hợp người khác đến đây.

Đối với mã ví dụ này, nếu nó đã được thay đổi để giống như thế này:

Thread m_MyThread; 
private void HandleMyThread() 
{ 
    while (true) 
    { 
     Thread.Sleep(5000); 
     return; 
    } 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    if (!m_MyThread.IsAlive) 
    { 
     m_MyThread = new Thread(HandleMyThread); 
     m_MyThread.IsBackground = true; 
     m_MyThread.Start(); 
    } 
} 

Điều này sẽ tạo ra một thể hiện mới của các chủ đề và bắt đầu nó. Lỗi ThreadStateException là vì, đơn giản, bạn không thể khởi động lại một chuỗi đang ở trạng thái dừng. m_MyThread.Start() chỉ hợp lệ cho các chủ đề ở trạng thái Unstarted. Những gì cần làm trong các trường hợp như thế này là tạo một thể hiện luồng mới và gọi Start() trên cá thể mới.

0

Để khởi động lại một chủ đề, hãy thử này:

private void button1_Click(object sender, EventArgs e) 
{ 
    // Just create a new constructor for the stopped Thread 
    m_MyThread = null; 
    m_MyThread = new Thread(HandleMyThread); 
    m_MyThread.IsBackground = true; 
    // Then restart the stopped Thread 
    m_MyThread.Start(); 
} 

này hoạt động nếu các chủ đề đã được ngừng lại trước đó.

+0

Đây là giải pháp tương tự đã được đưa ra bởi Daniel Winks (http://stackoverflow.com/a/8568206/2029849) – abto

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