C# 为什么主线程';谁的委托先被调用?

C# 为什么主线程';谁的委托先被调用?,c#,multithreading,C#,Multithreading,我是C#中多线程的新手。我创建了以下程序: class Program { static void Main(string[] args) { Thread.CurrentThread.Name = "main"; Thread t = new Thread(PrintName); t.Name = "worker"; t.Start(); P

我是C#中多线程的新手。我创建了以下程序:

class Program
{
    static void Main(string[] args)
    {
        Thread.CurrentThread.Name = "main";
        Thread t = new Thread(PrintName);
        t.Name = "worker";
        
        t.Start();
        PrintName();

        Console.ReadKey();
    }

    static void PrintName()
    {
        Console.WriteLine("Hello from " + Thread.CurrentThread.Name);
    }
}
输出是

梅因你好

工人你好

如果我将
PrintName()
方法的主体更改为

static void PrintName()
{
    if (Thread.CurrentThread.Name == "main")
    {
        Thread.Sleep(x);
    }

    Console.WriteLine("Hello from " + Thread.CurrentThread.Name);
}
如果
x
>=2,则按相反顺序输出消息


为什么会这样?我的推理是,在第一种情况下,即使在
Main()
方法中
t.Start()
PrintName()
之前,线程调度程序也没有足够的时间在
Main
worker
线程之间切换执行,因此也没有足够的时间来切换输出。有人能澄清/否定我的假设吗?

你问的问题通常是在操作系统/多线程入门课程中向大学生展示的第一张幻灯片。本质上,您拥有的是线程的执行,而不使用或其他来指定您的执行。因此,您的执行线程是一系列指令,这些指令与多线程环境中的其他此类序列同时执行。当这种情况发生时,正如@Andreas和@kurast所提到的,您的程序将变得随机。本质上,这在C#中归结为首先执行的字节码,它可以在程序的每次执行中改变。要解决这个问题,请阅读并发控制、竞争条件和关键部分,以便精确定义线程的调度

以下是几个关于多线程的好参考:


  • 如果您有任何问题,请告诉我

    您要问的问题通常是在操作系统/多线程入门课程中向大学生展示的第一张幻灯片。本质上,您拥有的是线程的执行,而不使用或其他来指定您的执行。因此,您的执行线程是一系列指令,这些指令与多线程环境中的其他此类序列同时执行。当这种情况发生时,正如@Andreas和@kurast所提到的,您的程序将变得随机。本质上,这在C#中归结为首先执行的字节码,它可以在程序的每次执行中改变。要解决这个问题,请阅读并发控制、竞争条件和关键部分,以便精确定义线程的调度

    以下是几个关于多线程的好参考:


  • 如果您有任何问题,请告诉我

    你不能指望任何订单,这是没有保证的。如果在执行中需要顺序,则需要以线程安全的方式执行。输出的顺序是不确定的,取决于您的体系结构、操作系统等。启动线程的成本相对较高,因此在大多数情况下,
    main
    消息是先打印的。您根本无法期望任何顺序,这是不保证的。如果在执行中需要顺序,则需要以线程安全的方式执行。输出顺序是不确定的,具体取决于您的体系结构、操作系统等。启动线程的成本相对较高,因此在大多数情况下,首先打印
    main
    消息。