我想了解多线程.我有一个示例在控制台应用程序中运行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();
Run Code Online (Sandbox Code Playgroud)
发生的事情是,我的控制台是黑色的,没有写在上面,但是当我按任意键时它会显示正确的结果.为什么?
我们中的一些人(查看问题下的评论)看到新线程在调用之前完整执行,而其他人则看到初始线程抢占新线程,在执行新线程之前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();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1235 次 |
| 最近记录: |