关于vb.net:如何让我的C#程序睡眠50毫秒?

关于vb.net:如何让我的C#程序睡眠50毫秒?

How do I get my C# program to sleep for 50 msec?

如何使我的C#程序休眠50毫秒?

这似乎是一个简单的问题,但是我正处于暂时性的脑衰竭时刻!


1
System.Threading.Thread.Sleep(50);

但是请记住,在主GUI线程中执行此操作将阻止您的GUI更新(感觉"缓慢")。

只需删除;使其也适用于VB.net。


(几乎)任何编程语言都有3种选择可以等待:

  • 宽松的等待

    • 在给定的时间执行线程块(=不消耗处理能力)
    • 无法在阻塞/等待的线程上进行处理
    • 不太精确
  • 紧等待(也称为紧循环)

    • 处理器在整个等待时间间隔内非常繁忙(实际上,它通常消耗一个内核的处理时间的100%)
    • 等待时可以执行一些动作
    • 非常精确
  • 前2个的组合

    • 它通常结合了1.的处理效率和2的精度+做某事的能力。
  • 1。-在C#中等待松散:

    1
    Thread.Sleep(numberOfMilliseconds);

    但是,Windows线程调度程序导致Sleep()的准确性约为15ms(因此,即使计划仅等待1ms,睡眠也可以轻松地等待20ms)。

    对于2-C#中的紧等待是:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    Stopwatch stopwatch = Stopwatch.StartNew();
    while (true)
    {
        //some other processing to do possible
        if (stopwatch.ElapsedMilliseconds >= millisecondsToWait)
        {
            break;
        }
    }

    我们也可以使用DateTime.Now或其他时间测量方式,但是Stopwatch更快(并且这实际上在紧密循环中变得可见)。

    3。-组合:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Stopwatch stopwatch = Stopwatch.StartNew();
    while (true)
    {
        //some other processing to do STILL POSSIBLE
        if (stopwatch.ElapsedMilliseconds >= millisecondsToWait)
        {
            break;
        }
        Thread.Sleep(1); //so processor can rest for a while
    }

    该代码定期阻塞线程1毫秒(或稍长一些,具体取决于OS线程调度),因此处理器在阻塞时间并不忙,并且代码不会消耗100%的处理器功率。在阻塞之间仍然可以执行其他处理(例如:UI更新,事件处理或进行交互/通信工作)。


    您无法在Windows中指定确切的睡眠时间。为此,您需要一个实时操作系统。您能做的最好的就是指定最短的睡眠时间。然后由调度程序在那之后唤醒您的线程。永远不要在GUI线程上调用.Sleep()


    从现在开始,您具有异步/等待功能,最好的睡眠时间为50ms是使用Task.Delay:

    1
    2
    3
    4
    5
    async void foo()
    {
        // something
        await Task.Delay(50);
    }

    或者,如果您以.NET 4(针对VS2010的Async CTP 3或Microsoft.Bcl.Async)为目标,则必须使用:

    1
    2
    3
    4
    5
    async void foo()
    {
        // something
        await TaskEx.Delay(50);
    }

    这样,您就不会阻塞UI线程。


    使用此代码

    1
    2
    3
    using System.Threading;
    // ...
    Thread.Sleep(50);

    1
    Thread.Sleep(50);

    线程将不会在指定的时间内调度为由操作系统执行。此方法将线程的状态更改为包括WaitSleepJoin。

    此方法不执行标准COM和SendMessage泵送。
    如果您需要在具有STAThreadAttribute的线程上睡眠,但是要执行标准的COM和SendMessage泵送,请考虑使用Join方法的重载之一,该重载指定超时间隔。

    1
    Thread.Join


    1
    Thread.Sleep

    为了提高可读性:

    1
    2
    using System.Threading;
    Thread.Sleep(TimeSpan.FromMilliseconds(50));

    从.NET Framework 4.5开始,可以使用:

    1
    2
    3
    using System.Threading.Tasks;

    Task.Delay(50).Wait();   // wait 50ms

    两全其美:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    using System.Runtime.InteropServices;

        [DllImport("winmm.dll", EntryPoint ="timeBeginPeriod", SetLastError = true)]
        private static extern uint TimeBeginPeriod(uint uMilliseconds);

        [DllImport("winmm.dll", EntryPoint ="timeEndPeriod", SetLastError = true)]
        private static extern uint TimeEndPeriod(uint uMilliseconds);
        /**
         * Extremely accurate sleep is needed here to maintain performance so system resolution time is increased
         */

        private void accurateSleep(int milliseconds)
        {
            //Increase timer resolution from 20 miliseconds to 1 milisecond
            TimeBeginPeriod(1);
            Stopwatch stopwatch = new Stopwatch();//Makes use of QueryPerformanceCounter WIN32 API
            stopwatch.Start();

            while (stopwatch.ElapsedMilliseconds < milliseconds)
            {
                //So we don't burn cpu cycles
                if ((milliseconds - stopwatch.ElapsedMilliseconds) > 20)
                {
                    Thread.Sleep(5);
                }
                else
                {
                    Thread.Sleep(1);
                }
            }

            stopwatch.Stop();
            //Set it back to normal.
            TimeEndPeriod(1);
        }


    推荐阅读

      linux操作数据库命令?

      linux操作数据库命令?,地址,服务,系统,密码,数据库,工具,名字,首页,命令,参

      linux系命令的操作?

      linux系命令的操作?,工作,系统,信息,网络,命令,基础,简介,管理,目录,操作,lin

      linux执行多次命令?

      linux执行多次命令?,系统,信息,标准,工作,情况,命令,周期性,服务,代码,时间,l

      linux显示操作命令?

      linux显示操作命令?,系统,工作,地址,信息,管理,命令,目录,基础,工具,标准,lin

      linux并行化执行命令?

      linux并行化执行命令?,系统,工具,信息,命令,名称,网络,管理,首页,服务,暂停,L

      如何执行linux命令?

      如何执行linux命令?,单位,系统,网络,信息,权威,命令,文件,音乐,目录,选项,mv

      linux打断执行的命令?

      linux打断执行的命令?,系统,状态,网站,标准,通用,客服,人员,名字,网络,暂停,L

      linux操作常用命令?

      linux操作常用命令?,工作,系统,地址,信息,命令,目录,管理,标准,基础,工具,lin

      linux命令没执行完?

      linux命令没执行完?,系统,设备,工具,情况,密码,状态,电脑,管理,材料,服务,Lin

      linux操作命令重命名?

      linux操作命令重命名?,图片,软件,名称,名字,文件,命令,状态,代码,工具,系统,L

      shell中执行linux命令?

      shell中执行linux命令?,系统,名称,环境,管理,工作,代码,技术,软件,经理,基础

      linux打印命令执行?

      linux打印命令执行?,信息,系统,工具,服务,命令,发行,基础,位置,设备,时间,怎

      linux执行两次命令?

      linux执行两次命令?,系统,信息,连续,名称,命令,初级,首页,工具,管理,终端,lin

      linux命令执行安装?

      linux命令执行安装?,软件,系统,管理,网站,官网,市场,中心,最新,灵活,工作,如

      linux执行一条新命令?

      linux执行一条新命令?,系统,工作,命令,管理,网络,服务,信息,目录,路径,脚本,L

      linux目录操作命令d?

      linux目录操作命令d?,工作,系统,信息,命令,情况,基础,数据,名称,地址,目录,li

      监控linux执行命令?

      监控linux执行命令?,系统,情况,数据,实时,网络,信息,状态,时间,设备,命令,如

      linux初学者操作命令?

      linux初学者操作命令?,工作,系统,信息,命令,网络,地址,单位,位置,管理,数据,L

      linux操作命令远程?

      linux操作命令远程?,软件,密码,系统,名称,图片,电脑,地址,网站,工具,服务,如

      linux命令卡死不执行?

      linux命令卡死不执行?,系统,设备,数据,密码,工具,情况,软件,环境,分析,命令,l