Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Visual Studio中的线程需要联接才能正常工作_C#_Multithreading_Visual Studio - Fatal编程技术网

C# Visual Studio中的线程需要联接才能正常工作

C# Visual Studio中的线程需要联接才能正常工作,c#,multithreading,visual-studio,C#,Multithreading,Visual Studio,这更像是一个“我想知道”的问题,而不是一个真正的问题 在努力提高线程技术的同时,我遇到了以下难题 源代码 internal class Program { private static void Main(string[] args) { var thread = new Thread(() => Print("Hello from t")); thread.Start(); //thread.Join(); }

这更像是一个“我想知道”的问题,而不是一个真正的问题

在努力提高线程技术的同时,我遇到了以下难题

源代码

internal class Program
{
    private static void Main(string[] args)
    {
        var thread = new Thread(() => Print("Hello from t"));
        thread.Start();
        //thread.Join();
    }

    private static void Print(string message)
    {
        Console.WriteLine(message);
    }
}
问题

如果我从Visual Studio运行应用程序(无论是调试还是发布配置),输出窗口中永远不会显示
消息
,除非我等待线程退出(使用
加入

解决方案

在命令提示符下运行编译后的可执行文件,您将看到预期的输出

我的问题

我要胡乱猜测一下,VisualStudio环境让一切变得不同


我想知道的是,如果我正在处理一个真实世界的应用程序,我将如何使用Visual Studio调试该应用程序,而不必被迫修改源代码(使用
加入
)?

调用
thread.Start()
只启动子线程,然后返回。由于这是
Main
函数的结束,程序将在子线程有机会打印消息之前完成并退出其进程


Visual Studio环境没有什么神秘之处,也没有什么奇怪之处,只是正常的Windows进程行为。

调用
thread.Start()
只是启动子线程,然后返回。由于这是
Main
函数的结束,程序将在子线程有机会打印消息之前完成并退出其进程


Visual Studio环境没有什么神秘之处,也没有什么奇怪之处,只是正常的Windows进程行为。

在现实世界的应用程序中,此代码不应出现,因为应用程序在线程完成之前退出存在问题。如果您确实有这个问题,它通常表示代码有问题

如果您正在使用消息泵(WinForms)或类似工具(WPF),应用程序将正常运行,这意味着在用户(或应用程序)通过请求应用程序退出打破循环之前,它不会退出。在这种情况下,线程将一直工作到完成或程序退出<代码>线程.Join()
可能仍需要调用,具体取决于场景

如果您正在创建控制台应用程序,则应在程序结束时调用
Thread.Join()
,以确保工作线程完成。另一种方法是使用
System.Windows.Forms.Application.Run()
启动消息泵。但是,它不是为此而设计的,除非您与用户交互,否则不应使用它

另一方面,C#中有两种线程:前台线程和后台线程。前台线程在主线程停止后继续运行。后台线程在所有前台线程完成时停止。默认类型是前台线程。您可以使用
thread.IsBackground
属性将线程显式设置为后台。visualstudio显然在处理线程,以至于前台线程无法阻止应用程序退出。在调试器之外运行程序可以正常工作


确保所有线程在主线程之前终止仍然是一个好主意。谁知道如果在退出
Main
之后运行更高级的代码会发生什么情况呢。

在现实世界的应用程序中,此代码不应该出现,因为在线程完成之前退出应用程序会出现问题。如果您确实有这个问题,它通常表示代码有问题

如果您正在使用消息泵(WinForms)或类似工具(WPF),应用程序将正常运行,这意味着在用户(或应用程序)通过请求应用程序退出打破循环之前,它不会退出。在这种情况下,线程将一直工作到完成或程序退出<代码>线程.Join()
可能仍需要调用,具体取决于场景

如果您正在创建控制台应用程序,则应在程序结束时调用
Thread.Join()
,以确保工作线程完成。另一种方法是使用
System.Windows.Forms.Application.Run()
启动消息泵。但是,它不是为此而设计的,除非您与用户交互,否则不应使用它

另一方面,C#中有两种线程:前台线程和后台线程。前台线程在主线程停止后继续运行。后台线程在所有前台线程完成时停止。默认类型是前台线程。您可以使用
thread.IsBackground
属性将线程显式设置为后台。visualstudio显然在处理线程,以至于前台线程无法阻止应用程序退出。在调试器之外运行程序可以正常工作


确保所有线程在主线程之前终止仍然是一个好主意。如果在退出
Main
后运行更高级的代码,谁知道会发生什么呢。

在现实世界的应用程序中,当程序的线程可能仍然繁忙时,让程序退出是愚蠢的。啊,doh!当然谢谢大家的解释。两个答案都澄清了我的困惑。很抱歉,我只能将一个标记为答案。在现实世界的应用程序中,当程序中的线程可能仍然繁忙时,让程序退出是愚蠢的。啊,doh!当然谢谢大家的解释。两个答案都澄清了我的困惑。对不起,我只能选一个作为答案。