问题是这样的:
            写了一个WinForm程序,用到了 SerialPort 控件发送和接收串口数据,每秒一次发送数据,代码如下:       //打开
        private void Form1_Load(object sender, EventArgs e)
         {
            serialPort1.Open();
            Thread.Sleep(200);
            serialPort1.WriteLine("#020208");
         }
      
        //接收并处理数据
        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
             try
            {
                 string str = serialPort1.ReadExisting();
                //处理数据并更新到界面上 (更新的数据量不多)
                  ......
            }
            catch
            {
                 SaveErrorLog();
            }
            finally
            {
                GC.Collect();
                Thread.Sleep(1000);
                serialPort1.WriteLine("#020208");
            }  
      }
程序很简单,可以正确接收数据,但是在任务管理器上发现程序开始的时候线程几乎是每秒加一个,过了一天之后发现尽然有513个线程,而且内存达到了一百多兆,不是很明白是哪里有问题?

解决方案 »

  1.   

    上面 少了个 Exception 保存错误信息到 日志中,但是没有错误
     
              catch(Exception ex)
                {
                     SaveErrorLog(ex.Message);//这里注释掉也没用
                }
      

  2.   

    楼主的问题应该在这:
                finally
                {
                    GC.Collect();
                    Thread.Sleep(1000);
                    serialPort1.WriteLine("#020208");
                }  
    serialPort1.WriteLine("#020208");这一句好像一直在调用自己,这样的话就会一直增加内存使用,幸亏c#内存是自动管理的,如果c++的话估计运行一天机器就死掉,无内存可用了。还有,强制垃圾回收器工作并一定不能达到你想的回收内存的效果。本人愚见,对你的控件不熟悉,仅供参考
      

  3.   

    GC.Collect();至少这行注释掉吧,效率太低