当前位置:编程学习 > C#/ASP.NET >>

C#内存增长问题

使用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# 内存 --------------------编程问答-------------------- 未完的代码如下所示
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;
                                --------------------编程问答--------------------  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();           
        }
求高手指点  --------------------编程问答-------------------- 求高手指点,谢谢 --------------------编程问答-------------------- 代码太多,看不懂。你最好把代码改为每一个方法只有10行左右代码的风格。另外,一对case语句,不知道是从哪里学的编程。

扔出一个代码,你很难抄袭到别人的一堆同样是随便扔出来的代码。只有交流软件工程,尽量少写代码,将你的系统进行有意义的封装和自动化测试,才可能解决大问题。 --------------------编程问答-------------------- 一对case语句  -->  一堆case语句

把你的代码改变风格,不但好读,而且也容易维护。 --------------------编程问答-------------------- 天知道StaticParameters.Driver.Waveform怎么实现的。如果是它泄露了内存,你有什么办法? --------------------编程问答-------------------- 你要先确定是托管内存泄露还是非托管资源泄露,用到外部的控件,最好调用它的dispose方法,释放非托管资源,
--------------------编程问答--------------------
引用 6 楼 caozhy 的回复:
天知道StaticParameters.Driver.Waveform怎么实现的。如果是它泄露了内存,你有什么办法?

这是我们调用的一个仪器命令函数 ,内存的增长和这个没有多大的关系 我感觉是就后面的绘图那里 waveformPlot8.PlotY(chData, 0, fetchX_increment);
所造成的内存增长 但是不知道该怎么解决这个问题 --------------------编程问答--------------------
引用 6 楼 caozhy 的回复:
天知道StaticParameters.Driver.Waveform怎么实现的。如果是它泄露了内存,你有什么办法?
这是一个COM组件 如果要释放这个所占资源 请问有什么方法吗 --------------------编程问答-------------------- 我也碰到这情况,不论怎样都搞不定,只好搞了个定时重启程序,如天数不一样,就重启。 --------------------编程问答-------------------- c#编程很爽,但就是内存增长问题最头痛,PB就没这回事。 --------------------编程问答--------------------
引用 11 楼 chhlly804 的回复:
c#编程很爽,但就是内存增长问题最头痛,PB就没这回事。

自己水平不行造成泄露还能怪语言不够好?估计C++,C之流的是不是可以评价为废品了? --------------------编程问答-------------------- 再搞个 定时重启软件吧··· --------------------编程问答--------------------
引用 12 楼 wddw1986 的回复:
Quote: 引用 11 楼 chhlly804 的回复:

c#编程很爽,但就是内存增长问题最头痛,PB就没这回事。

自己水平不行造成泄露还能怪语言不够好?估计C++,C之流的是不是可以评价为废品了?

求方法解决StaticParameters.Driver.Waveform该COM组件所引起的问题,使用Marshal.ReleaseComObjct()方法没有解决掉内存增长的问题, --------------------编程问答--------------------
引用 11 楼 chhlly804 的回复:
c#编程很爽,但就是内存增长问题最头痛,PB就没这回事。


C#是开发语言,PB是开发工具,兄台,这么比太业余了。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,