2013-02-23 41 views
1

在下面的控制台应用程序中,如果我在最后一行Go()放置了一个断点,并通过按F5执行到断点(在调试模式下),结果在每次运行时并不完全不同。
控制台可以为空(不输出任何东西):在调试时,如何确保输出不会进入每行代码?

Console is blank

,也可以输出只是另一个运行结果的一部分:

Partial results output

,或在极少数情况下,结果“完整”(“实现”):

the results are "complete" ("actualized")

如果我通过F10(Step Over)或F11(Step into)进行调试,则执行结果会立即输出到控制台窗口。

Stepping through code outputs the results immediately

为什么这种差异?
假设我正在调试一个使用三维方库的应用程序来源代码,我没有认识到。
是否有可能确保他们的输出没有进入他们的代码?

控制台应用程序的代码: “?为什么这种差异”

using System; 
using System.Threading; 

namespace _5_2 
{ 
    class ThreadNaming 
{ 
    static void Main() 
    { 
     Thread.CurrentThread.Name = "main"; 
     Thread worker = new Thread(Go); 
     Thread worker2 = new Thread(Go); 
     worker.Name = "1111"; 
     worker.Start(); 
     //string just4breakPoint = "aaa"; 
     worker2.Name = "2222"; 
     worker2.Start(); 
     Go(); 
     Console.ReadLine(); 
    } 

    static void Go() 
    { 
     Console.WriteLine 
     ("Hello from " + Thread.CurrentThread.Name); 
    } 
    } 
} 

回答

2

- 这是因为步调试引入了线程的同步,并可能改变事情发生的顺序。

您将此标记为问题的事实可能表明您需要在代码中进行同步。

+0

谢谢。正如我写的,问题是我正在处理3D方库以获取我无法访问的源代码(并且在不违反许可条款的情况下不能干涉它们)。我希望可以解决/回答标题中的问题 – Fulproof 2013-02-23 04:49:34

+0

我已经回答了这个问题:如果涉及多个线程,除非您有明确的同步,否则无法保证输出顺序。无论是第三方还是您自己的代码。 – 2013-02-23 04:52:16

+0

这个问题不是关于排序,而是关于在断点代码之前执行完成的输出。以任何顺序 – Fulproof 2013-02-23 04:54:45

0

对我来说只有after discussion变得很清楚,为了完整输出达到由F5产生的断点,需要通过F10或F11执行一次步调试来同步输出。在大多数情况下,这意味着在具有断点的行之后(感兴趣的行之前或之后)插入可执行代码的虚拟行,以引入通过虚拟“步进”同步输出一次的能力。