我在Visual Studio 2010,Windows XP SP3中运行下面的C#代码 .
在“无需调试启动”(通过Ctrl F5或从菜单中),输出:
- 你好主要
Worker 你好
“从调试开始”(通过F5或菜单)显示相反的顺序:
- Worker 问好
主要你好
多次检查 . 它具有可重复性和可重复性 .
为什么?
using System;
using System.Threading;
namespace _5NamingThreads
{
class ThreadNaming
{
static void Main()
{
Thread.CurrentThread.Name = "main";
Thread worker = new Thread(Go);
worker.Name = "worker";
worker.Start();
Go();
Console.ReadLine();
}
static void Go()
{
Console.WriteLine("Hello from " + Thread.CurrentThread.Name);
}
}
}
Update :
第二天,重新启动计算机后,我总是会观察在所有模式下发布和调试都具有相当可重现性的顺序:
- 你好主要
Worker 你好
后续问题:
While debugging, is it possible to ensure the output without stepping into each line of code?
2 回答
在调试模式下,线程启动过程需要在新线程中初始化调试上下文 . 这必须在函数返回之前完成,因为原始线程可能在新线程上运行 . 最终结果是这会使原始线程变慢,使新线程首先运行 .
当然,这不是你应该依赖的东西 . 它可能会在下一版本的操作系统,库,调试器,CPU中发生变化......
这是因为启动新的异步线程是不确定的 . 换句话说,开发人员不能依赖线程以相同的顺序执行 . 见race conditions.