[英]why my infinite loop doesn't work
我在一个类中有一个静态方法:
public static void MakeThreadModified(string s)
{
new Thread(() =>
{
Thread.CurrentThread.IsBackground = true;
/* run your code here */
while (true)
{
Console.WriteLine(s);
Thread.Sleep(500);
}
}).Start();
}
我在 Main() 中调用这个方法是这样的:
string[] str = {"A", "B", "C", "D", "E"};
foreach (var v in str)
{
MakeThreadModified(v);
}
我惊讶地发现结果是:
A
E
C
B
D
但是为什么我会有这个结果? 我以为它会不停地在控制台上连续打印从“A”到“E”的字母,但它只是每个字母打印一次。 那么为什么会发生这种情况呢?
由于您已将线程.IsBackground
属性设置为true
,因此该线程不会使您的应用程序保持活动状态。 所以在你的MakeThreadModified
结束后程序结束,所以线程......在你的循环之后添加一个Console.ReadLine()
以保持应用程序的活动......
请尝试使用下面的代码。 我怀疑你在 main 的末尾没有 Console.ReadLine() 。
class Program
{
static void Main( string[ ] args )
{
string[ ] str = { "A", "B", "C", "D", "E" };
foreach( var v in str )
{
MakeThreadModified( v );
}
Console.ReadLine( );
}
public static void MakeThreadModified( string s )
{
new Thread( obj =>
{
Thread.CurrentThread.IsBackground = true;
/* run your code here */
while( true )
{
Console.WriteLine( $"[{Thread.CurrentThread.ManagedThreadId}] {( string )obj}" );
Thread.Sleep( 500 );
}
} ).Start( s );
}
}
好吧,我不是 C# 开发人员,但它是编程领域中的一个常见概念,某个程序的main()
运行在一个特定线程(主线程)中,并且其他线程以相同的方式在其工作完成后退出并且不在无限循环情况下,主线程也会完成,无论任何其他线程与其并行运行。 因此,当主线程结束时,您将不会收到来自任何其他线程的任何输出,因为程序主输出与主线程(您在调用程序时启动的线程)相关联。
正确的做法是如@Derek 之前所说:在主线程终止之前“加入所有线程”。 join()
在调用时就像主线程的信号量,即:对于在特定线程上调用的每个.join()
,主函数必须等待该特定线程完成。
t1.Join();
t2.Join();
t3.Join();
强制主线程等待 t1、t2 和 t3。 这里的问题是您创建了匿名线程,因此没有一种简单的方法来引用它们。
正如我之前所说:我不是 C# 开发人员,所以我真的不知道处理它的最佳方法是什么(也许通过线程池?),但是上述添加Console.ReadLine()
可能会解决问题,即使根本与其他线程无关,这只是让主线程等待某些东西(来自用户的输入)的“技巧”。
我整篇文章的想法是警告你一个main thread
的存在,如果你没有明确通知它(通过.join()
),它不关心或不知道其他并行运行的线程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.