0

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

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

源代码

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 运行应用程序(无论是 Debug 还是 Release 配置),除非我等待线程退出(使用),否则message永远不会显示在输出窗口中。Join

解决方案

从命令提示符运行编译的可执行文件,您会看到预期的输出。

我的问题

我会大胆猜测并说 Visual Studio 环境使一切变得不同。

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

4

2 回答 2

2

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

毫无疑问,Visual Studio 环境没有什么奇怪的,只是正常的 Windows 进程行为。

于 2012-04-16T20:55:04.880 回答
2

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

If you are making use of a message pump (WinForms) or similar (WPF), the application will run as normal, meaning it won't exit until the user (or the application) breaks the loop by requesting the application exit. In this case, the thread will work until it finishes, or until the program exits. Thread.Join() may need to be called anyway, depending on the scenario.

If you are creating a console application, Thread.Join() should be called at the end of the program to ensure the worker thread completes. An alternative is to start the message pump with System.Windows.Forms.Application.Run(). However, it is not designed for this, and should not be used unless you are interacting with the user.

另一方面,C#中有两种线程:前台线程和后台线程。主线程停止后,前台线程继续运行。当所有前台线程都完成后,后台线程就会停止。默认类型是前台线程。您可以使用该属性将线程显式设置为后台Thread.IsBackground。Visual Studio 显然对线程进行了监视,以至于前台线程不会阻止应用程序退出。在调试器之外运行程序可以正常工作。

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

于 2012-04-16T20:55:19.363 回答