很困惑,有时候,需要用到“不停的”,“循环”,“条件循环”的执行某一段操作时。我都开个线程去执行这个方法。看例子:
         if (readPCI == null || readPCI.IsAlive == false)
            {
                readPCI = new Thread(new ThreadStart(readPCIDdata));
                readPCI.Start();
            }
---------------------------------------------------------------------
        private delegate void readPCI();
        private void readPCIDdata()
        {
            if (hDevice != (IntPtr)(-1))
            {
                if (!tabControl.InvokeRequired)
                {
                    Int32 Return = PCI8735.PCI8735_ReadDeviceAD(hDevice, ADBuffer, nReadSizeWord, ref nRetSizeWord);
                    if (Return != 0)
                    {
                        while (autorun)
                        {
                            Thread.Sleep(1000);
                            if (PCI8735.PCI8735_ReadDeviceAD(hDevice, ADBuffer, nReadSizeWord, ref nRetSizeWord) <= 0)//连续地读取AD数据
                            {
                                StatusLabel.Text = "AD数据读取失败!";
                            }
                            else 
                            {
                                deleWindData();
                                flag++;
                            }
                            StatusLabel.Invalidate();
                            tabControl.Invalidate();
                            Begin.Invalidate();
                        }
                    }
                    else
                    {
                        StatusLabel.Text = "PCI8735采集卡读取AD数据出错";
                    }
                }
                else
                {
                    readPCI read = new readPCI(readPCIDdata);
                    Invoke(read);
                }
            }
        }
但是,去执行这个线程的时候,程序还是卡住了,想请教一下,在C#里面,如何最优的使用线程!!Thank you

解决方案 »

  1.   

    StatusLabel.Invalidate();
    tabControl.Invalidate();
    Begin.Invalidate();这3句,刷太狠了吧。
      

  2.   

    加上一个 Thread.Sleep() 看看。
      

  3.   

    whilei里面本来就有sleep的。我想一秒钟去读一次
      

  4.   

    Invalidate是最低级别的刷新了吧,还没用refresh,update呢。。
      

  5.   

    有的啊,这里不是要更新控件上的内容么
    StatusLabel.Text = "AD数据读取失败!";
      

  6.   

    Invoke(read)在hDevice == (IntPtr)(-1))时不是无限递归吗.
      

  7.   

    重绘是在OnPaint里有处理,你只是给.Text赋值不需要的
      

  8.   

    即然另开线程,来处理,某件事,那么这个线程最好不要和UI打交到,否则,如果这个线程很耗时的话,UI就很容易假死。最好是只在必要的时候,更新一下UI
      

  9.   

    什么啊。是while无限循环啊。不会导致递归吧