理解多线程C#

Ima*_*mad 9 c# multithreading

我想了解多线程.我有一个示例在控制台应用程序中运行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)

发生的事情是,我的控制台是黑色的,没有写在上面,但是当我按任意键时它会显示正确的结果.为什么?

Gra*_*ICA 3

我们中的一些人(查看问题下的评论)看到新线程在调用之前完整执行,而其他人则看到初始线程抢占新线程,在执行新线程之前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)