2010-03-19 86 views

Trả lời

14

Join() về cơ bản là while(thread.running){}

{ 
    thread.start() 
    stuff you want to do while the other thread is busy doing its own thing concurrently 
    thread.join() 
    you won't get here until thread has terminated. 
} 
3

Giả sử bạn có một chuỗi chính ủy nhiệm một số công việc cho chuỗi công việc. Các chủ đề chính cần một số kết quả mà các công nhân đang tính toán, do đó, nó không thể tiếp tục cho đến khi tất cả các chủ đề công nhân đã hoàn thành.

Trong trường hợp này, luồng chính sẽ gọi Join() trên mỗi chuỗi công việc. Sau khi tất cả các cuộc gọi Join() đã trở lại, chủ đề chính biết rằng tất cả các luồng công nhân đã hoàn tất và kết quả tính toán có sẵn cho mức tiêu thụ của nó.

3

Hãy tưởng tượng chương trình của bạn chạy trong Thread1. Sau đó, bạn cần bắt đầu một số tính toán hoặc xử lý - bạn bắt đầu một luồng khác - Thread2. Sau đó, nếu bạn muốn Thread1 của bạn chờ đợi cho đến khi Thread2 kết thúc, bạn thực hiện Thread1.Join();Thread1 sẽ không tiếp tục thực hiện cho đến khi kết thúc Thread2.

Đây là mô tả trong MSDN.

+0

MSDN nói rằng "Chặn chuỗi gọi cho đến khi chuỗi kết thúc, trong khi tiếp tục thực hiện bơm tiêu chuẩn COM và SendMessage.". Ý nghĩa của việc thực hiện chuẩn COM là gì? Ý nghĩa của bơm sendMessage là gì? – Techee

+2

thực sự, điều đó không chính xác. nếu bạn muốn 'Thread1' đợi cho đến khi' Thread2' kết thúc, bạn thực hiện 'Thread2.Join()', không phải 'Thread1.Join()'. – d7samurai

3

Ví dụ phương pháp đơn giản:

public static void Main(string[] args) 
{ 
    Console.WriteLine("Main thread started."); 

    var t = new Thread(() => Thread.Sleep(2000)); 

    t.Start(); 

    t.Join(); 

    Console.WriteLine("Thread t finished."); 
} 

Chương trình bắt đầu bằng cách in một thông điệp tới các màn hình và sau đó bắt đầu một chủ đề mới mà chỉ dừng lại trong 2 giây trước khi chấm dứt. Tin nhắn cuối cùng chỉ được in sau khi kết thúc chuỗi t thực hiện vì lệnh gọi phương thức Join chặn luồng hiện tại cho đến khi chuỗi t kết thúc.

+0

Nó đơn giản, nhưng cũng khá vô dụng: Một Thread.Start ngay lập tức theo sau bởi một Thread.Join đánh bại toàn bộ mục đích của việc sử dụng một sợi thứ hai. (Tôi biết đó là một ví dụ đồ chơi, nhưng vẫn ...) – Heinzi

+1

@Heinzi, nó chỉ thể hiện hành vi cơ bản của phương thức 'Tham gia' theo yêu cầu. Nó không bao giờ có ý định mô tả một kịch bản thế giới thực. –

1
static void Main() 
{ 
Thread t = new Thread(new ThreadStart(some delegate here)); 
t.Start(); 
Console.WriteLine("foo"); 
t.Join() 
Console.WriteLine("foo2"); 
} 

Trong đại biểu của bạn, bạn sẽ có một cuộc gọi như thế này:

Console.WriteLine("foo3"); 

Output là:

foo 
foo3 
foo2 
8
int fibsum = 1; 

Thread t = new Thread(o => 
          { 
           for (int i = 1; i < 20; i++) 
           { 
            fibsum += fibsum; 
           } 
          }); 

t.Start(); 
t.Join(); // if you comment this line, the WriteLine will execute 
      // before the thread finishes and the result will be wrong 
Console.WriteLine(fibsum); 
0

Đây chỉ là để thêm vào các câu trả lời hiện có, giải thích những gì Join làm.

Gọi Join cũng có tác dụng phụ của việc cho phép máy bơm tin nhắn xử lý tin nhắn. Xem điều này knowledge base article cho các tình huống mà điều này có thể có liên quan.

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