Ý nghĩa của phương thức Thread.Join trong C# là gì?Ý nghĩa của phương thức Thread.Join trong C# là gì?
MSDN nói rằng nó chặn chuỗi cuộc gọi cho đến khi một chuỗi kết thúc. Ai có thể giải thích điều này với một ví dụ đơn giản?
Ý nghĩa của phương thức Thread.Join trong C# là gì?Ý nghĩa của phương thức Thread.Join trong C# là gì?
MSDN nói rằng nó chặn chuỗi cuộc gọi cho đến khi một chuỗi kết thúc. Ai có thể giải thích điều này với một ví dụ đơn giản?
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.
}
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ó.
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();
và 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.
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.
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
@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. –
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
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);
Đâ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.
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
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