使用C#做个一个Winform程序,在界面中使用了timer控件 每次时钟调用后 内存会出现一定的内存增长 运行8个小时左右,电脑就会出现out of memory的系统异常,前提 我已经另外调用一个Timer空间每隔1分钟就调用一次GC.collect()进行垃圾回收。求高手指点一下,代码如下:
private void timer3_Tick(object sender, EventArgs e){
            try
            {
                int SamCount = 0;
                flag_Complete = StaticParameters.Driver.Status.get_Register(GuetDigitizer1StatusRegisterEnum.GuetDigitizer1StatusRegisterOperation, GuetDigitizer1StatusSubRegisterEnum.GuetDigitizer1StatusSubRegisterCondition);
                if (flag_Complete == 512)
                {
                    label_ViewRate.Text = comboBox_SampleRate.Text;
                    //label_ViewSampleCount.Text = textBox_SampleCount.Text + "Samples";
                    StringBuilder sb = new StringBuilder();
                    sb.Append(textBox_SampleCount.Text);
                    sb.Append("Samples");
                    label_ViewDataSamCount.Text = sb.ToString();
                    sb.Length = 0;
                    getChannelList();
                    if (int.Parse(textBox_SampleCount.Text) < (Xvalue / fetchX_increment))
                    {
                        SamCount = int.Parse(textBox_SampleCount.Text);
                    }
                    else
                    {
                        SamCount = (int)(Xvalue / fetchX_increment);
                    }
                    getChannelList();                    List<double> ls = new List<double>(100000 * chanlistlen);
                    if (SamCount <= 32768)
                    {
                        ls.AddRange(StaticParameters.Driver.Waveform.FetchVoltageData(channellist, 0, SamCount, "1", 50000));
                    }
                    else if (SamCount > 32768 && SamCount <= 65536)
                    {
                        ls.AddRange(StaticParameters.Driver.Waveform.FetchVoltageData(channellist, 0, 32768, "1", 50000));
                        ls.AddRange(StaticParameters.Driver.Waveform.FetchVoltageData(channellist, 32768, SamCount - 32768, "1", 50000));
                    }
                    else if (SamCount > 65536 && SamCount <= 98304)
                    {
                        ls.AddRange(StaticParameters.Driver.Waveform.FetchVoltageData(channellist, 0, 32768, "1", 50000));
                        ls.AddRange(StaticParameters.Driver.Waveform.FetchVoltageData(channellist, 32768, 32768, "1", 50000));
                        ls.AddRange(StaticParameters.Driver.Waveform.FetchVoltageData(channellist, 65536, SamCount - 65536, "1", 50000));                    }
                    else if (SamCount > 98304 && SamCount <= 100000)
                    {
                        ls.AddRange(StaticParameters.Driver.Waveform.FetchVoltageData(channellist, 0, 32768, "1", 50000));
                        ls.AddRange(StaticParameters.Driver.Waveform.FetchVoltageData(channellist, 32768, 32768, "1", 50000));
                        ls.AddRange(StaticParameters.Driver.Waveform.FetchVoltageData(channellist, 65536, 32768, "1", 50000));
                        ls.AddRange(StaticParameters.Driver.Waveform.FetchVoltageData(channellist, 98304, SamCount - 98304, "1", 50000));
                    }
                    else
                    {
                        MessageBox.Show("数据过大");
                        return;
                    }
                    double[] getData = ls.ToArray();
                    int zeoNumAfterJ = 0;
                    double[] chData = new double[getData.Length / chanlistlen];
                    for (int j = 0; j < 8; j++)
                    {
                        if (channels[j] != '0')
                        {
                            zeoNumAfterJ = 0;
                            for (int k = 7; k > j; k--)
                            {
                                if (channels[k] == '0')
                                    zeoNumAfterJ += 1;
                            }
                            for (int i = 0; i < getData.Length / chanlistlen; i++)
                            {
                                chData[i] = getData[chanlistlen * i + j - zeroNum + zeoNumAfterJ];
                            }
                            for (int i = 0; i < chData.Length; i++)
                            {
                                switch (k_b_flag[j])
                                {
                                    case 1:
                                        {
                                            /*if (chData[i] >= -0.25 && chData[i] <= 0)
                                                chData[i] = chData[i] * k_jiaozheng[j, 0] + b_jiaozheng[j, 0];
                                            else if (chData[i] > 0 && chData[i] <= 0.25)
                                                chData[i] = chData[i] * k_jiaozheng[j, 1] + b_jiaozheng[j, 1];
                                            else
                                                chData[i] = chData[i];*/
                                                chData[i] = chData[i] * k_jiaozheng[j] + b_jiaozheng[j];
                                        }
                                        break;
                                    case 2:
                                        {
chData[i] = chData[i] * k_jiaozheng[j, 0] + b_jiaozheng[j, 0];
                                            else if (chData[i] > 0 && chData[i] <= 0.5)
                                                chData[i] = chData[i] * k_jiaozheng[j, 1] + b_jiaozheng[j, 1];
                                            else
                                                chData[i] = chData[i];*/
                                                chData[i] = chData[i] * k_jiaozheng[j] + b_jiaozheng[j];
                                        }
                                        break;
                                    case 3:
                                        {
 chData[i] = chData[i] * k_jiaozheng[j, 0] + b_jiaozheng[j, 0];
                                            else if (chData[i] >= 0 && chData[i] <= 1)
                                                chData[i] = chData[i] * k_jiaozheng[j, 1] + b_jiaozheng[j, 1];
                                            else
                                                chData[i] = chData[i];*/
                                                chData[i] = chData[i] * k_jiaozheng[j] + b_jiaozheng[j];
                                        }
                                        break;
                                    case 4:
                                        {
  chData[i] = chData[i] * k_jiaozheng[j, 0] + b_jiaozheng[j, 0];
                                            else if (chData[i] >= 0 && chData[i] <= 2)
                                                chData[i] = chData[i] * k_jiaozheng[j, 1] + b_jiaozheng[j, 1];
                                            else
                                                chData[i] = chData[i];*/
                                                chData[i] = chData[i] * k_jiaozheng[j] + b_jiaozheng[j];
                                        }
                                        break;
                                    case 5:
                                        {
chData[i] = chData[i] * k_jiaozheng[j, 0] + b_jiaozheng[j, 0];
                                            else if (chData[i] > 0 && chData[i] <= 4)
                                                chData[i] = chData[i] * k_jiaozheng[j, 1] + b_jiaozheng[j, 1];
                                            else
                                                chData[i] = chData[i];*/
                                                chData[i] = chData[i] * k_jiaozheng[j] + b_jiaozheng[j];
                                        }
                                        break;
                                    case 6:
                                        {
chData[i] = chData[i] * k_jiaozheng[j, 0] + b_jiaozheng[j, 0];
                                            else if (chData[i] > 0 && chData[i] <= 8)
                                                chData[i] = chData[i] * k_jiaozheng[j, 1] + b_jiaozheng[j, 1];
                                            else
                                                chData[i] = chData[i];*/
                                                chData[i] = chData[i] * k_jiaozheng[j] + b_jiaozheng[j];
                                        }
                                        break;
                                    case 7:
                                        {
chData[i] = chData[i] * k_jiaozheng[j, 0] + b_jiaozheng[j, 0];
                                            else if (chData[i] >= 0 && chData[i] <= 16)
                                                chData[i] = chData[i] * k_jiaozheng[j, 1] + b_jiaozheng[j, 1];
                                            else
                                                chData[i] = chData[i];*/
                                                chData[i] = chData[i] * k_jiaozheng[j] + b_jiaozheng[j];
                                        }
                                        break;
                                    case 8:
                                        {
                    chData[i] = chData[i] * k_jiaozheng[j, 0] + b_jiaozheng[j, 0];
                                            else if (chData[i] >= 0 && chData[i] <= 32)
                                                chData[i] = chData[i] * k_jiaozheng[j, 1] + b_jiaozheng[j, 1];
                                            else
                                                chData[i] = chData[i];*/
                                                chData[i] = chData[i] * k_jiaozheng[j] + b_jiaozheng[j];
                                        }
                                        break;
                                    default:
                                        break; }   }    C#内存

解决方案 »

  1.   

    未完的代码如下所示
    waveformGraph1 = null;
                                switch (j)
                                {
                                    case 0:
                                        {
                              waveformPlot1.PlotY(chData, 0, fetchX_increment);
                                            double average = 0;
                                            if (chData.Length == 0)
                                                average = 0;
                                            else
                                            {
                                     for (int count = 0; count < chData.Length; count++)
                                                {
                                                    average += chData[count];
                                                }
                                                average = average / chData.Length;
                                            }
                                            StringBuilder sb1 = new StringBuilder();
                                            sb1.Append(((float)average).ToString());
                                            sb1.Append(" V");
                                            textBox_Ave1.Text = sb1.ToString();
                                            sb1.Remove(0, sb1.Length); sb1.Length = 0;
                                        } break;
                                    case 1:
                                        {
                               waveformPlot2.PlotY(chData, 0, fetchX_increment);
                                            double average = 0;
                                            if (chData.Length == 0)
                                                average = 0;
                                            else
                                            {
                                                for (int count = 0; count < chData.Length; count++)
                                                {
                                                    average += chData[count];
                                                }
                                                average = average / chData.Length;
                                            }
     StringBuilder sb1 = new StringBuilder();
                                            sb1.Append(((float)average).ToString());
                                            sb1.Append(" V");
                                            textBox_Ave2.Text = sb1.ToString();
                                            sb1.Remove(0, sb1.Length); sb1.Length = 0;
                                        } break;
                                    case 2:
                                        {
                             waveformPlot3.PlotY(chData, 0, fetchX_increment);
                                           double average = 0;
                                            if (chData.Length == 0)
                                                average = 0;
                                            else
                                            {
                                                for (int count = 0; count < chData.Length; count++)
                                                {
                                                    average += chData[count];
                                                }
                                                average = average / chData.Length;
                                            }
    StringBuilder sb1 = new StringBuilder();
                                            sb1.Append(((float)average).ToString());
                                            sb1.Append(" V");
                                            textBox_Ave3.Text = sb1.ToString();
                                            sb1.Remove(0, sb1.Length); sb1.Length = 0;
                                        } break;
                                    case 3:
                                        {
                                     waveformPlot4.PlotY(chData, 0, fetchX_increment);
                                            double average = 0;
                                            if (chData.Length == 0)
                                                average = 0;
                                            else
                                            {
                                 for (int count = 0; count < chData.Length; count++)
                                                {
                                                    average += chData[count];
                                                }
                                                average = average / chData.Length;
                                            }
    StringBuilder sb1 = new StringBuilder();
                                            sb1.Append(((float)average).ToString());
                                            sb1.Append(" V");
                                            textBox_Ave4.Text = sb1.ToString();
                                            sb1.Remove(0, sb1.Length); sb1.Length = 0;
                                        } break;
                                   
      

  2.   

     case 4:
                                        {
                                            waveformPlot5.PlotY(chData, 0, fetchX_increment);
                                            double average = 0;
                                            if (chData.Length == 0)
                                                average = 0;
                                            else
                                            {
                                                for (int count = 0; count < chData.Length; count++)
                                                {
                                                    average += chData[count];
                                                }
                                                average = average / chData.Length;
                                            }
    StringBuilder sb1 = new StringBuilder();
                                            sb1.Append(((float)average).ToString());
                                            sb1.Append(" V");
                                            textBox_Ave5.Text = sb1.ToString();
                                            sb1.Remove(0, sb1.Length); sb1.Length = 0;
                                        } break;
                                    case 5:
                                        {
                                            double average = 0;                                        if (chData.Length == 0)
                                                average = 0;
                                            else
                                            {
                                                for (int count = 0; count < chData.Length; count++)
                                                {
                                                    average += chData[count];
                                                }
                                                average = average / chData.Length;
                                            }
                                                                                  StringBuilder sb1 = new StringBuilder();
                                            sb1.Append(((float)average).ToString());
                                            sb1.Append(" V");
                                            textBox_Ave6.Text = sb1.ToString();
                                            sb1.Remove(0, sb1.Length); sb1.Length = 0;
                                        } break;
                                    case 6:
                                        {
                                            waveformPlot7.PlotY(chData, 0, fetchX_increment);
                                            double average = 0;
                                            if (chData.Length == 0)
                                                average = 0;
                                            else
                                            {
                                                for (int count = 0; count < chData.Length; count++)
                                                {
                                                    average += chData[count];
                                                }
                                                average = average / chData.Length;
                                            }
                                                                                  StringBuilder sb1 = new StringBuilder();
                                            sb1.Append(((float)average).ToString());
                                            sb1.Append(" V");
                                            textBox_Ave7.Text = sb1.ToString();
                                            sb1.Remove(0, sb1.Length); sb1.Length = 0;
                                        } break;
                                    case 7:
                                        {
                                            waveformPlot8.PlotY(chData, 0, fetchX_increment);
                                            double average = 0;
                                            if (chData.Length == 0)
                                                average = 0;
                                            else
                                            {
                                                for (int count = 0; count < chData.Length; count++)
                                                {
                                                    average += chData[count];
                                                }
                                                average = average / chData.Length;
                                            }                                                                        StringBuilder sb1 = new StringBuilder();
                                            sb1.Append(((float)average).ToString());
                                            sb1.Append(" V");
                                            textBox_Ave8.Text = sb1.ToString();
                                            sb1.Remove(0, sb1.Length);
                                            sb1.Length = 0;
                                        } break;
                                    default:
                                        {
                                        } break;
                                }
                            }
                            ls.Clear();
                            ls.Capacity = 0;
                        }
                        chData = null;                    
                        StaticParameters.Driver.Measurement.Initiate();                                     
                    }
                }
                catch (Exception ex)
                {
                        timer3.Enabled = false;
                        timer1.Enabled = false;
                        MessageBox.Show("Run出错,错误原因为:\n" + ex.Message +DateTime.Now.ToString()+"\r\n");
                    
                }
            }
    private void timer1_Tick(object sender, EventArgs e)
            {
               GC.Collect();           
            }
    求高手指点 
      

  3.   

    代码太多,看不懂。你最好把代码改为每一个方法只有10行左右代码的风格。另外,一对case语句,不知道是从哪里学的编程。扔出一个代码,你很难抄袭到别人的一堆同样是随便扔出来的代码。只有交流软件工程,尽量少写代码,将你的系统进行有意义的封装和自动化测试,才可能解决大问题。
      

  4.   

    一对case语句  -->  一堆case语句把你的代码改变风格,不但好读,而且也容易维护。
      

  5.   

    天知道StaticParameters.Driver.Waveform怎么实现的。如果是它泄露了内存,你有什么办法?
      

  6.   

    你要先确定是托管内存泄露还是非托管资源泄露,用到外部的控件,最好调用它的dispose方法,释放非托管资源,
      

  7.   

    这是我们调用的一个仪器命令函数 ,内存的增长和这个没有多大的关系 我感觉是就后面的绘图那里 waveformPlot8.PlotY(chData, 0, fetchX_increment);
    所造成的内存增长 但是不知道该怎么解决这个问题
      

  8.   

    这是一个COM组件 如果要释放这个所占资源 请问有什么方法吗
      

  9.   

    自己水平不行造成泄露还能怪语言不够好?估计C++,C之流的是不是可以评价为废品了?
    求方法解决StaticParameters.Driver.Waveform该COM组件所引起的问题,使用Marshal.ReleaseComObjct()方法没有解决掉内存增长的问题,
      

  10.   


    C#是开发语言,PB是开发工具,兄台,这么比太业余了。