了解多线程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();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章