在Visual Studio中执行线程处理需要Join才能正常工作

问题描述:

这是更多的“我想知道”类问题,而不是真正的问题。在Visual Studio中执行线程处理需要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应用程序(无论它是调试或发布配置),message永远不会在显示的问题输出窗口除非我等待线程退出(使用Join)。

解决方案

运行编译在命令提示符下执行的,你看到预期的输出。

我的问题

我会扔胡乱猜测,说Visual Studio环境使所有的差异。

我想知道的是,如果我正在研究一个真实世界的应用程序,我将如何使用Visual Studio调试所述应用程序,而不必强制修改源代码(使用Join)?

+0

在真实世界的应用程序中,当程序有可能仍然很忙的线程时,你会愚蠢地让程序退出。 – 2012-04-16 20:56:32

+0

啊,啊!当然!谢谢大家的解释。两个答案都澄清了我的困惑。对不起,我只能标记一个作为答案。 – 2012-04-16 21:02:27

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

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

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

另一方面,C#中有两种线程:前台线程和后台线程。在主线程停止后,前台线程继续运行。后台线程在所有前台线程完成时停止。默认类型是前台线程。您可以使用Thread.IsBackground属性明确设置线程为背景。Visual Studio显然是与线程一起使用的,前景线程不会阻止应用程序退出。在调试器外运行该程序可以正常工作。

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

电话thread.Start()只是启动辅助线程,然后返回。由于这是Main函数的结束,程序结束并且其进程在辅助线程有机会打印消息之前退出。

没有神秘感,对于Visual Studio环境来说并不奇怪,只是正常的Windows进程行为。