【问题标题】:Does main thread wait for child thread completion? [duplicate]主线程是否等待子线程完成? [复制]
【发布时间】:2022-01-02 01:23:47
【问题描述】:

我在 Windows 上有 .net 核心和简单的代码。如您所见,目前没有Join()。所以主线程不会等待孩子,但是当我运行时:

C:\...\bin\Release\netcoreapp3.1>dotnet ConsoleAppTest.dll
> 4
> mission complete
> Thread complete

C#代码:

static void Main(string[] args)
{
    new Thread(() =>
    {
        Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
        Thread.Sleep(10000);
        Console.WriteLine("Thread complete");
    }).Start();

    Console.WriteLine("mission complete");
}

我认为主线程应该运行而不是等待子线程。我错了吗?

当我启动时

 Task.Run(() =>
            {
                Thread.Sleep(10000);
                Console.WriteLine("Thread complete");
            });

主线程不等待

【问题讨论】:

  • 您是在调试还是发布模式下运行?直接使用Thread 有什么特别的原因吗?
  • 在vs外发布,所以没有副作用

标签: c# .net multithreading .net-core


【解决方案1】:

来自Thread.IsBackground 文档:

后台线程与前台线程相同,只是后台线程不会阻止进程终止。一旦属于一个进程的所有前台线程都已终止,公共语言运行时就会结束该进程。

默认情况下,以下线程在前台执行(即它们的 IsBackground 属性返回 false):

  • 主线程(或主应用程序线程)。
  • 通过调用Thread 类构造函数创建的所有线程。

您正在创建阻止进程终止的前台线程。

另请注意,自引入 TPL 以来,通常不建议直接使用线程,但如果有特殊原因让您使用它们,您可以将 IsBackground 属性设置为 true 以允许进程终止:

var thread = new Thread(() =>
{
    Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
    Thread.Sleep(1000);
    Console.WriteLine("Thread complete");
});
thread.IsBackground = true;
thread.Start();

【讨论】:

    猜你喜欢
    • 2017-07-19
    • 2012-07-22
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 2011-06-05
    相关资源
    最近更新 更多