为什么我的无限循环不起作用

时间:2017-09-27 14:36:59

标签: c# multithreading loops

我在类中有一个静态方法:

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'的字母,但它只打印每个字母一次。那为什么会这样呢?

4 个答案:

答案 0 :(得分:8)

由于您已将线程.IsBackground属性设置为true,因此此线程会使应用程序保持活动状态。所以在你的MakeThreadModified - 循环结束后程序结束,所以线程...... 在循环之后添加Console.ReadLine()以使应用程序保持活动状态......

答案 1 :(得分:1)

另一种选择可能是加入所有线程以防止它们终止。

但使用任务可能更容易。

请参阅:Create multiple threads and wait all of them to complete

答案 2 :(得分:0)

请尝试使用以下代码。我怀疑你在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 );
    }
}

答案 3 :(得分:0)

好吧,我不是C#开发人员,但它是编程领域的一个常见概念,某个程序的main()在一个特定的线程(主线程)中运行,并且在同一个线程中运行当其他线程完成工作并且无法处于无限循环状态时,其他线程就会退出,主线程也会完成,无论其他任何线程并行运行。因为当主线程结束时你不会从任何其他线程接收任何输出,因为程序主输出绑定到主线程(你在调用程序时启动的那个)。

正确的事情是@Derek之前说过:"加入所有线程"在主线程终止之前。 join()在调用时就像主线程的信号量,即:对于在特定线程上调用的每个.join(),主函数必须等待特定线程到光洁度。

t1.Join();
t2.Join();
t3.Join();

强制主线程等待t1,t2和t3。这里的问题是你创建了匿名线程,所以没有一种简单的方法可以引用它们。

正如我之前所说:我不是C#开发人员,所以我真的不知道处理它的最佳方法(可能通过一个线程池?),但前面提到的添加Console.ReadLine()的解决方案可以解决问题,甚至根本不与其他线程相关,它只是一个'技巧'使主线程等待(来自用户的输入)。

我的整个帖子的想法是警告你,如果你没有明确地通知它,那么main thread的存在并不关心或了解其他并行运行的线程。 .join())。