Thread.Sleep(1)的目的?

时间:2011-12-19 23:30:26

标签: c# multithreading

我正在阅读一些线程基础知识,在msdn网站上我找到了这段代码。

    // Put the main thread to sleep for 1 millisecond to
    // allow the worker thread to do some work:
    Thread.Sleep(1);

以下是该页面的链接:http://msdn.microsoft.com/en-us/library/7a2f3ay4(v=vs.80).aspx

为什么主线程睡眠时间为1毫秒?如果主线程持续运行,辅助线程是否会启动其任务?或者是一个需要1毫秒的任务的例子?如果任务一般需要5秒才能完成,主线程应该睡眠5000毫秒?

如果这仅仅是关于CPU使用情况,则类似Question about Thread.Sleep

任何意见都将不胜感激。

感谢。

5 个答案:

答案 0 :(得分:7)

该代码中的1并不特别;因为事情不是那么精确,所以总是总是最终睡眠时间更长,并且放弃你的时间片并不等于你得到它时OS的任何保证。

Thread.Sleep()中时间参数的目的是,你的线程将为至少大致产生这段时间。

因此代码只是明确地放弃了它的时间段。一般来说,不需要这样的代码,因为操作系统会为你管理你的线程,抢先中断它们以便在其他线程上工作。

这种代码通常用于"线程示例",其中作者想要强制某些人为事件来证明某些竞争条件等(在您的示例中似乎是这种情况)


正如Jon Hanna对同一问题的回答所指出的那样,Sleep(0)Sleep(1)(或任何其他非零数字)之间存在微妙但重要的区别,并且作为ChrisF在某些线程情况下,这可能很重要。

这两个都涉及线程优先级;线程可以被赋予更高/更低的优先级,使得只要存在具有任何工作要做的更高优先级线程,优先级较低的线程将永远执行。在这种情况下,可能需要Sleep(1) ... 然而 ...

低优先级线程也受其他进程在同一系统上执行的操作的影响;因此,虽然您的进程可能没有运行更高优先级的线程,但如果其他任何线程运行,您的进程仍然无法运行。

这不是通常你需要担心的事情;默认优先级是“正常”'优先级,在大多数情况下,你不应该改变它。提高或降低它有很多含义。

答案 1 :(得分:4)

如果具有相同优先级的线程已准备好进行调度,

Thread.Sleep(0)将放弃线程的其余时间片。

Thread.Sleep(1)(或任何其他值,但1是具有此效果的最低值)将无条件地放弃线程的其余时间片。如果它想确保即使具有较低优先级的线程都有机会运行(并且这样的线程可能正在阻止该线程,它必须这样做),那么它就是那个。

http://www.bluebytesoftware.com/blog/PermaLink,guid,1c013d42-c983-4102-9233-ca54b8f3d1a1.aspx对此有更多了解。

答案 2 :(得分:2)

如果主线程根本没有休眠,那么其他线程将根本无法运行。

插入Sleep 任何长度允许其他线程一些处理时间。使用较小的值(在这种情况下为1毫秒)意味着主线程似乎没有锁定。您可以使用Sleep(0),但正如Jon Hanna所指出的那样,Sleep(1)具有不同的含义(或者实际上是任何正值),因为它只允许具有相同优先级的线程运行。

如果任务需要5秒钟,那么主线程将会睡眠总共5,000毫秒,但会延长一段时间。

答案 3 :(得分:0)

这只是为了示例 - 他们希望确保工作线程有机会在主线程杀死它之前至少打印一次“工作线程:工作......”。

正如安德鲁暗示的那样,这在示例中非常重要,特别是因为如果您在单处理器计算机上运行,​​主线程可能不会放弃处理器,在有机会迭代一次之前终止后台线程。

答案 4 :(得分:0)

我今天注意到有趣的事情。中断线程会引发ThreadInterruptedException。我试图抓住异常,但由于某种原因不能。我的同事建议我在catch语句之前添加Thread.Sleep(1),这样我就能抓住ThreadInterruptedException

        // Start the listener
        tcpListener_ = new TcpListener(ipAddress[0], int.Parse(portNumber_));
        tcpListener_.Start();
        try
        {
            // Wait for client connection
            while (true)
            {
                // Wait for the new connection from the client
                if (tcpListener_.Pending())
                {
                    socket_ = tcpListener_.AcceptSocket();
                    changeState(InstrumentState.Connected);

                    readSocket();
                }
                Thread.Sleep(1);
            }
        }

        catch (ThreadInterruptedException) { }

        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Contineo", MessageBoxButtons.OK, MessageBoxIcon.Error);
            Console.WriteLine(ex.StackTrace);
        }

其他一些课......

        if (instrumentThread_ != null)
        {
            instrumentThread_.Interrupt();
            instrumentThread_ = null;
        }