2011-01-31 32 views
13

Làm thế nào để tạm dừng luồng và tiếp tục khi một số sự kiện xảy ra?C#: Làm thế nào để tạm dừng luồng và tiếp tục khi một số sự kiện xảy ra?

Tôi muốn chuỗi tiếp tục khi nhấp vào nút. Có người cho rằng thread.suspend không phải là cách thích hợp để tạm dừng luồng. Sau đó, một giải pháp khác?

+0

Bạn có thể sử dụng một [System.Threading.EventWaitHandle] (http: // msdn.microsoft.com/en-us/library/system.threading.eventwaithandle.aspx) – Marlon

+0

@Marlon bạn có thể đã nói rằng trong câu trả lời ... –

Trả lời

12

Bạn có thể sử dụng System.Threading.EventWaitHandle.

Một khối EventWaitHandle cho đến khi nó được báo hiệu. Trong trường hợp của bạn, nó sẽ được báo hiệu bởi sự kiện bấm nút.

private void MyThread() 
{ 
    // do some stuff 

    myWaitHandle.WaitOne(); // this will block until your button is clicked 

    // continue thread 
} 

Bạn có thể báo hiệu xử lý chờ đợi của bạn như thế này:

private void Button_Click(object sender, EventArgs e) 
{ 
    myWaitHandle.Set(); // this signals the wait handle and your other thread will continue 
} 
+1

Làm thế nào để ban đầu EventWaitHandler đúng? Có phải là EventWaitHandler mới (false, EventResetMode.AutoReset) –

+0

Tôi làm 'EventWaitHandle mới (false, EventResetMode.ManualReset)'. 'false' khởi tạo EventWaitHandle để unsignaled, vì vậy nó sẽ chặn. – Marlon

+0

Video này đã giúp tôi hiểu https://www.youtube.com/watch?v=xaaRBh07N34 – reggaeguitar

6

Thực tế, việc tạm dừng một chuỗi là hành động không tốt vì bạn hiếm khi biết chính xác những gì một chủ đề đang thực hiện tại thời điểm đó. Nó có thể dự đoán trước hơn để có chuỗi chạy qua số ManualResetEvent, mỗi lần gọi số WaitOne(). Điều này sẽ hoạt động như một cổng - chuỗi điều khiển có thể gọi Reset() để đóng cổng (tạm dừng luồng, nhưng an toàn) và Set() để mở cổng (tiếp tục chuỗi).

Ví dụ: bạn có thể gọi WaitOne khi bắt đầu mỗi lần lặp vòng lặp (hoặc mỗi lần lặp lại n nếu vòng lặp quá chặt).

2

Bạn có thể thử điều này cũng

private static AutoResetEvent _wait = new AutoResetEvent(false); 

public Form1() 
    { 
     InitializeComponent(); 
    } 

private void Form1_Load(object sender, EventArgs e) 
    { 
     Control.CheckForIllegalCrossThreadCalls = false; 
     backgroundWorker1.RunWorkerAsync(); 
    } 
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     Dosomething(); 
    } 

private void Dosomething() 
{ 
//Your Loop 
for(int i =0;i<10;i++) 
    { 
    //Dosomething 
    _wait._wait.WaitOne();//Pause the loop until the button was clicked. 

    } 
} 

private void btn1_Click(object sender, EventArgs e) 
    { 
     _wait.Set(); 
    } 
Các vấn đề liên quan