2008-08-09 36 views
8

Tôi có một số mã để bắt đầu một thread trên NET CF 2.0:Làm thế nào để chờ hoàn thành chuỗi trước khi tiếp tục?

ThreadStart tStart = new ThreadStart(MyMethod); 
Thread t = new Thread(tStart); 
t.Start(); 

Nếu tôi gọi đây là bên trong một vòng lặp các mục hoàn tất ra khỏi trật tự. Làm thế nào để giới thiệu một sự chờ đợi sau khi t.Start(), để công việc trên chuỗi hoàn thành trước khi mã tiếp tục? Sẽ BeginInvoke/EndInvoke là một lựa chọn tốt hơn cho việc này hơn là tạo các luồng thủ công?

Trả lời

9

bao nhiêu để bạn cần phải áp đặt trên các chủ đề? Nếu bạn chỉ cần tất cả các công việc bắt đầu trong vòng lặp để kết thúc trước khi mã tiếp tục, nhưng bạn không quan tâm đến thứ tự công việc trong vòng lặp kết thúc, sau đó gọi tham gia là câu trả lời. Để thêm chi tiết hơn vào Kevin Kenny's answer, bạn nên gọi Tham gia bên ngoài vòng lặp. Điều này có nghĩa bạn sẽ cần một bộ sưu tập để giữ tham chiếu đến các chủ đề bạn bắt đầu:

// Start all of the threads. 
List<Thread> startedThreads = new List<Thread>(); 
foreach (...) { 
    Thread thread = new Thread(new ThreadStart(MyMethod)); 
    thread.Start(); 
    startedThreads.Add(thread); 
} 

// Wait for all of the threads to finish. 
foreach (Thread thread in startedThreads) { 
    thread.Join(); 
} 

Ngược lại, nếu bạn gọi Tham gia bên trong vòng lặp, kết quả sẽ về cơ bản giống như không sử dụng ở tất cả các chủ đề. Mỗi lần lặp của thân vòng lặp sẽ tạo và bắt đầu một luồng nhưng sau đó ngay lập tức tham gia nó và đợi nó kết thúc.

Nếu các chủ đề riêng lẻ tạo ra một số kết quả (ví dụ: viết thư trong nhật ký) thì thư có thể vẫn xuất hiện không đúng thứ tự vì không có sự phối hợp giữa các chuỗi. Có thể để có được các chủ đề để xuất kết quả của họ theo thứ tự bằng cách phối hợp chúng với một màn hình.

2

Nếu tôi đọc chính xác, bạn đang bắt đầu các mục công việc theo chuỗi chủ đề nhưng bạn lo ngại rằng các chuỗi đang hoàn thành không đúng thứ tự, và muốn đợi cho đến khi mỗi chuỗi hoàn thành theo thứ tự chúng đã được bắt đầu?

Nếu trường hợp này xảy ra thì tôi không chắc chắn lý do bạn tạo chuỗi cho mỗi mục công việc. Có lẽ bạn có thể mở rộng?

Nếu bạn cần phải chờ đợi cho một thread để hoàn thành bạn chỉ có thể làm:

t.Join(); 
4

Một cách khác để đợi luồng hoàn thành là sử dụng AutoResetEvent.

private readonly AutoResetEvent mWaitForThread = new AutoResetEvent(false); 

private void Blah() 
{ 
    ThreadStart tStart = new ThreadStart(MyMethod); 
    Thread t = new Thread(tStart); 
    t.Start(); 

    //... (any other things) 
    mWaitForThread.WaitOne(); 
} 

private void MyMethod() 
{ 
    //... (execute any other action) 
    mWaitForThread.Set(); 
} 
Các vấn đề liên quan