C# 线程程序中奇怪的执行顺序

C# 线程程序中奇怪的执行顺序,c#,multithreading,visual-studio-2013,C#,Multithreading,Visual Studio 2013,我正试图通过下面的代码以线程的形式执行管理器。奇怪的是,当我一步一步地编写代码时,Stop()方法似乎在管理器中的Start()方法之前调用了 MyManager manager = new MyManager(); Thread thread = new Thread(manager.Start); thread.Start(); while (Directory.GetFiles(pathToFiles).Length < 5) Thread.Sleep(1000); mana

我正试图通过下面的代码以线程的形式执行管理器。奇怪的是,当我一步一步地编写代码时,
Stop()
方法似乎在管理器中的
Start()
方法之前调用了

MyManager manager = new MyManager();
Thread thread = new Thread(manager.Start);
thread.Start();

while (Directory.GetFiles(pathToFiles).Length < 5)
  Thread.Sleep(1000);

manager.Stop();
thread.Join();
MyManager=newmymanager();
线程线程=新线程(manager.Start);
thread.Start();
while(Directory.GetFiles(pathToFiles).Length<5)
睡眠(1000);
经理。停止();
thread.Join();
比这更奇怪有时执行顺序与预期一致。然后,好像有什么东西阻塞了理智,首先命中
Stop()
方法中的断点,然后命中
Start()
方法中的断点

我怀疑有更复杂的事情,因为有时程序在执行时甚至没有达到断点(我执行的方式完全相同)


我不是线程开发的大师,我需要知道如何解决这个问题。

这是一个竞争条件。一个线程运行以调用
开始
,其他线程运行以调用
停止
。其中一个先达到目标。有道理吗

如果希望先调用Start,然后按顺序调用它们:

Start();
...
Stop();

当您不使用调试器时,它是否正常工作?当然,它是这样工作的。CPU可以随时自由地运行它想要的任何线程。如果它想在启动另一个之前运行一个直到完成,那么在中途切换,在它想做的任何一点上,它都可以做这些事情。这完全是意料之中的行为。@Savanna Nope。同样的错误行为。它在少数情况下有效,最多失败。@Servy我不明白。这和我试图开始然后停止的线索是一样的。它不能和自己比赛,对吗?!这是一条看起来很幸运的线,它的影子比自己快…?:(@KonradViltersten不是。要么条件是真的,而你根本没有意识到这一点,要么你似乎认为
Stop
方法在它运行之前就已经运行了。另一个线程与此无关,真的。+1是简洁的答案。现在,回到你身边。不,在这一点上,线程没有任何意义,哈哈哈。我以为我做了c所有
都按此顺序开始
停止
。我不是吗?!@KonradViltersten不,你告诉他们两个都按CPU选择的顺序运行,按照自己认为合适的顺序交织方法的内容。请容忍我,因为我现在感觉自己像个白痴。首先我启动线程,然后在文件出现之前我等待了很长一段时间(其中至少有五个)。首先,我执行停止。文件不在那里,但它已经跳到停止。怎么做?!显然,你还没有等待足够长的时间。你打算让Start添加5个文件吗?如果执行正确,这将起作用。一定有一些错误导致在第5个文件出现时Start仍在运行,以便Start和stop同时运行.Servy的评论和您的答案=终于让它运行良好。现在我在它停止工作之前跑回家。:)