我以前用VC++ SDK编过程序,知道它其实是用一个无限循环来实现的,程序如下:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}现在我用C#编了个程序,用Thread来实现一个无限循环,模拟VC++
        private void button1_Click(object sender, EventArgs e)
        {            
            ThreadStart ts = new ThreadStart(test);
            t = new Thread(ts);
            t.Start();
        }        public void test()
        {
            while (true)
            {
            }
        }
这是一个无限循环,用一个Thread来实现,可是当我考察它们的CPU利用率的时候发现VC++那个是0%,然而C#的这个是100%。这是怎么回事?都是无限循环,为什么C#的就这么慢?我怎样才能使C#的那个无限循环Thread的CPU利用率降到可以接受的水平?多谢高手

解决方案 »

  1.   

    你的VC++代码里用的是Windows消息队列,循环效率低,当然CPU利用率也低。
    C#那个就是个纯正的无限循环,一个线程在那里什么也不干,一直地循环,当然就CPU利用率高了,不光C#,你用别的任何语言这么写,都是这个样子。其实在循环里加上一个Thread.Sleep(5)就没事了。
      

  2.   

    public void test()
            {
                while (true)
                {
                    System.Threading.Thread.Sleep(500);  // 毫秒数
                }
            }
      

  3.   

    vc和操作系统是紧密结合的,它采用的方式都是和操作系统基本一致的,其实C#内核也是一样的,所以在WINDOWS的调度下,不会出现CPU100%的情况,可是你自己的编的一个无限循环,不受这个控制,而且实现目的不一样,
    VC++的消息循环内部还有很多调度机制,所以不会死机,而你的只是你自己写的一个无限循环,没有这种调试机制,不死机还等什么呢……
      

  4.   

    循环调件是不一样的
    GetMessage(&msg, NULL, 0, 0)是api ,调用他时系统会把你这个进程挂起,如何没有消息的话
    不信你可以试试把
    while( GetMessage(&msg, NULL, 0, 0 ) )
    改为
    while(1)
      

  5.   

    我现在知道了,有的时候我加上一个 Application.Run(); 就可以使得Thread挂起来,然后我开好几个Thread或者Timer来赶我自己的事情,但就是不知道怎样停止 Application.Run(); 有高手知道吗?