在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
)?
在实际应用程序中,此代码不应出现,因为在线程完成之前应用程序退出的问题。如果你确实有这个问题,它通常表示代码存在问题。
如果您正在使用消息泵(WinForms)或类似的应用程序(WPF),应用程序将正常运行,这意味着它将不会退出,直到用户(或应用程序)通过请求应用程序中断循环出口。在这种情况下,线程将一直工作直到完成,或者直到程序退出。可能需要调用Thread.Join()
,具体取决于场景。
如果您正在创建控制台应用程序,应在程序结束时调用Thread.Join()
以确保工作线程完成。另一种方法是使用System.Windows.Forms.Application.Run()
启动消息泵。但是,它不是为此设计的,除非您与用户进行交互,否则不应使用它。
另一方面,C#中有两种线程:前台线程和后台线程。在主线程停止后,前台线程继续运行。后台线程在所有前台线程完成时停止。默认类型是前台线程。您可以使用Thread.IsBackground
属性明确设置线程为背景。Visual Studio显然是与线程一起使用的,前景线程不会阻止应用程序退出。在调试器外运行该程序可以正常工作。
确保所有线程在主线程之前终止仍是一个好主意。谁知道如果在退出Main
后运行更高级的代码会发生什么情况。
电话thread.Start()
只是启动辅助线程,然后返回。由于这是Main
函数的结束,程序结束并且其进程在辅助线程有机会打印消息之前退出。
没有神秘感,对于Visual Studio环境来说并不奇怪,只是正常的Windows进程行为。
在真实世界的应用程序中,当程序有可能仍然很忙的线程时,你会愚蠢地让程序退出。 – 2012-04-16 20:56:32
啊,啊!当然!谢谢大家的解释。两个答案都澄清了我的困惑。对不起,我只能标记一个作为答案。 – 2012-04-16 21:02:27