【发布时间】:2020-10-27 10:27:28
【问题描述】:
C#中Thread.Join方法的意义是什么?
MSDN 说它会阻塞调用线程,直到线程终止。谁能用一个简单的例子来解释一下?
【问题讨论】:
标签: c# multithreading
C#中Thread.Join方法的意义是什么?
MSDN 说它会阻塞调用线程,直到线程终止。谁能用一个简单的例子来解释一下?
【问题讨论】:
标签: c# multithreading
Join() 基本上就是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.
}
【讨论】:
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);
【讨论】:
假设您有一个将一些工作委托给工作线程的主线程。主线程需要一些工作线程正在计算的结果,因此在所有工作线程完成之前它无法继续。
在这种情况下,主线程会在每个工作线程上调用Join()。在所有Join() 调用都返回后,主线程知道所有工作线程都已完成,并且计算结果可供其使用。
【讨论】:
假设您的程序在Thread1 中运行。然后你需要开始一些计算或处理——你开始另一个线程——Thread2。然后,如果您希望 Thread1 等到 Thread2 结束,则执行 Thread1.Join(); 并且 Thread1 将在 Thread2 完成之前继续执行。
这是MSDN中的描述。
【讨论】:
Thread1 等到Thread2 结束,你执行Thread2.Join(),而不是Thread1.Join()。
简单的示例方法:
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.");
}
程序首先在屏幕上打印一条消息,然后启动一个新线程,该线程在终止前暂停 2 秒。最后一条消息仅在t 线程完成执行后打印,因为Join 方法调用会阻塞当前线程,直到t 线程终止。
【讨论】:
Join 方法的基本行为。它从未打算描绘真实世界的场景。
static void Main()
{
Thread t = new Thread(new ThreadStart(some delegate here));
t.Start();
Console.WriteLine("foo");
t.Join()
Console.WriteLine("foo2");
}
在您的委托中,您将有另一个这样的电话:
Console.WriteLine("foo3");
输出是:
foo
foo3
foo2
【讨论】:
这只是对现有答案的补充,解释了Join 的作用。
调用Join 还具有允许消息泵处理消息的副作用。有关这可能相关的情况,请参阅此knowledge base article。
【讨论】: