C# Thread.Sleep(0)和Join()的使用

C# Thread.Sleep(0)和Join()的使用,c#,multithreading,C#,Multithreading,我正在读一本关于多线程程序的书,我发现了一个小例子: public static class Program { public static void ThreadMethod() { for (int i = 0; i < 10; i++) { Console.WriteLine(“ThreadProc: {0}”, i); Thread

我正在读一本关于多线程程序的书,我发现了一个小例子:

public static class Program
    {
        public static void ThreadMethod()
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(“ThreadProc: {0}”, i);
                Thread.Sleep(0);
            }
        }
        public static void Main()
        {
            Thread t = new Thread(new ThreadStart(ThreadMethod));
            t.Start();
            for (int i = 0; i < 4; i++)
            {
                Console.WriteLine(“Main thread: Do some work.”);
                Thread.Sleep(0);
            }
            t.Join();
        }
    }
公共静态类程序
{
公共静态void ThreadMethod()
{
对于(int i=0;i<10;i++)
{
WriteLine(“ThreadProc:{0}”,i);
睡眠(0);
}
}
公共静态void Main()
{
螺纹t=新螺纹(新螺纹起点(螺纹方法));
t、 Start();
对于(int i=0;i<4;i++)
{
WriteLine(“主线程:做一些工作”);
睡眠(0);
}
t、 Join();
}
}
我脑子里有太多的问题:

1) Thread.Sleep(0)有什么用,我的意思是,我试过两种情况:有或没有Thread.Sleep(0),在运行时没有太大区别

2) t.Join()在这里真的有用吗,因为它位于Main方法的末尾?

将让位给其他优先级不低于您的线程:

如果毫秒刺激参数的值为零,则线程将其剩余时间片放弃给准备运行的具有同等优先级的任何线程。如果没有其他具有相同优先级的线程准备运行,则当前线程的执行不会挂起

因此,在本例中,它试图使线程以近似相等的速度运行

这种用法表明,在线程完成工作之前,不需要结束程序。然而,正如所指出的,默认情况下,属性是
false
,因此您的线程是前台线程,并将保持程序自己运行,直到它们完成工作为止。如果您的程序有更多的事情要做,并且通常需要线程的工作结果,那么
Join
调用将非常重要


尝试将
IsBackground
属性设置为不同的值,然后尝试删除
Join
调用,看看会发生什么。

t.Join()
是必需的,否则程序可能会因
ThreadMethod()
未完成执行而停止。这本书是什么?我想知道,所以我不推荐。Thread.Sleep(0)毫无用处。在单核机器上,您会看到有睡眠和无睡眠的行为非常不同@约翰森理解它强制进行上下文切换,因此在单核机器上它可以有自己的用途。@ScottChamberlain:我不知道:“线程将其剩余的时间片让给任何具有同等优先级的、准备运行的线程”如果一本书没有清楚地解释join and wait的目的,却展示了这些代码,我不希望初学者从中学习。@ScottChamberlain似乎你是对的,谢谢你指出这一点。我添加了以下信息:)