繁体   English   中英

理解多线程C#

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM