【问题标题】:C# Joining ThreadsC# 加入线程
【发布时间】:2009-10-12 10:47:08
【问题描述】:

我试图对 C# 中的多线程有一个很好的理解,但我对 Thread.Join 方法的适用性有点困惑。微软说它“阻塞调用线程,直到线程终止”。两个问题:

  1. 在以下示例中,哪个线程实际上被阻塞,而另一个线程正在终止?

  2. 一个线程被阻塞而另一个线程正在执行终止这一事实是否实际上违背了多线程的目的? (所以我假设您只想在某些情况下加入。可能是什么?)

static int Main()
    {
      Alpha oAlpha = new Alpha();
      Thread oThread = new Thread(new ThreadStart(oAlpha.Beta));
      oThread.Start();
      oThread.Join();
    }

我还应该注意,我完全有可能在这里没有做正确的事情。

【问题讨论】:

  • 精彩的文章,应该会有所帮助 - albahari.com/threading
  • 哈哈,谢谢。我看到了这一点,但只有在答案开始出现之后。我实际上正要开始阅读它。

标签: c# multithreading


【解决方案1】:

Main 被阻止,直到 oThread 完成。

这个想法是你可以干净地终止线程并等待它自己清理,而不是草率地杀死线程。

它也适用于启动一组三个或四个独立进程,然后在所有进程完成后继续。

【讨论】:

  • 因此,在这个简单的示例中,删除连接可能会导致当前线程(正在运行的主线程)在 oThread 完成之前下降到方法的末尾,从而杀死 oThread 并将其留在状态不好。如果这是正确的,那么我假设如果原始线程终止,那么 oThread 也会终止。对吗?
  • 视情况而定。如果线程设置为Background 线程,那么是的,这正是它的工作方式。如果您将该属性设置为 false,它将保持进程打开直到终止。
【解决方案2】:
  1. 运行 Main() 方法的线程阻塞。

  2. 线程通常需要同步,例如,如果您不希望 main 方法在所有工作完成之前退出。在您的示例中,没有任何好处,但您可以在 Start() 和 Join() 调用之间插入有用的工作。如果您分离多个线程然后将它们全部加入,这将特别有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-05
    • 2022-10-23
    • 2010-10-24
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多