我正在尝试了解多线程。我有一个示例,该示例从控制台应用程序的Main方法运行两个线程。
new Thread(() =>
{
for (int x = 0; x < 10; x++)
{
Console.WriteLine("First :" + x);
}
}).Start();
new Thread(() =>
{
for (int x = 0; x < 10; x++)
{
Console.WriteLine("Second :" + x);
}
}).Start();
Console.ReadKey();
发生的事情是,我的控制台变黑了,上面没有写任何东西,但是当我按下任意键时,它将显示正确的结果。为什么?
我们中的一些人(查看问题下的注释)看到新线程在Console.ReadKey()
调用之前完整执行,而其他人则看到初始线程优先于新线程,并Console.ReadKey()
在执行新线程之前等待输入。
您有三个线程都在做自己的事情,都可能写入控制台并执行其他逻辑,并且您实际上无法控制在特定时刻执行哪个线程。
根据Eric的说法,这种行为是可以预期的,并且您执行新线程的方式是不可预测的。(在此处重新张贴他的评论,以防评论被清理掉)
再次阅读我的两个基本规则:(1)试图在两个线程上执行UI的程序已损坏,(2)不要期望任何东西都能正常运行。我不希望给出的损坏程序会产生任何行为。而且,我不希望损坏的程序的行为在多次运行或跨机器时保持一致。我也不希望这种行为会不一致。损坏的程序已损坏;他们不需要在不良行为方面保持一致或不一致。
有一个调用可让您阻止初始(主)线程(恰好是调用线程),直到新线程执行完毕,即Thread.Join。您仍然无法控制两个新线程执行和写入控制台的顺序,但是至少初始线程已暂停。
var threads = new Thread[] {
new Thread(() =>
{
for (int x = 0; x < 10000; x++)
{
Console.WriteLine("First :" + x);
}
}),
new Thread(() =>
{
for (int x = 0; x < 10000; x++)
{
Console.WriteLine("Second :" + x);
}
})
};
// start the threads
foreach (var t in threads)
t.Start();
// block the initial thread until the new threads are finished
foreach (var t in threads)
t.Join();
// Now the following line won't execute until both threads are done
Console.ReadKey();
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句