[英]Understanding multithreading C#
我想了解多线程。 我有一个示例在控制台应用程序中运行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();
让我将第一个生成的线程称为thread1,将下一个生成的线程称为thread2。 此外,让我们调用创建thread1和thread2作为mainthread的线程。
松散地说,不能保证thread1中的代码会在thread2或mainthread之前执行。 因此,根据各种情况,它可能会在停止Console.WriteLine()
之前执行一些Console.ReadKey()
。
你可能会问为什么它停在Console.ReadKey()
; 因为控制台I / O是同步的。 Console。*调用周围的lock
语句可能会更明显(对于演示代码)
如果你希望其他2个线程在调用Console.ReadKey()
(阻塞I / O调用)之前完成处理,你应该在调用Console.ReadKey()
之前调用thread1.Join()
和thread2.Join()
Console.ReadKey()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.