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方法,释放非托管资源,
--------------------编程问答--------------------
这是我们调用的一个仪器命令函数 ,内存的增长和这个没有多大的关系 我感觉是就后面的绘图那里 waveformPlot8.PlotY(chData, 0, fetchX_increment);
所造成的内存增长 但是不知道该怎么解决这个问题 --------------------编程问答-------------------- 这是一个COM组件 如果要释放这个所占资源 请问有什么方法吗 --------------------编程问答-------------------- 我也碰到这情况,不论怎样都搞不定,只好搞了个定时重启程序,如天数不一样,就重启。 --------------------编程问答-------------------- c#编程很爽,但就是内存增长问题最头痛,PB就没这回事。 --------------------编程问答--------------------
自己水平不行造成泄露还能怪语言不够好?估计C++,C之流的是不是可以评价为废品了? --------------------编程问答-------------------- 再搞个 定时重启软件吧··· --------------------编程问答--------------------
求方法解决StaticParameters.Driver.Waveform该COM组件所引起的问题,使用Marshal.ReleaseComObjct()方法没有解决掉内存增长的问题, --------------------编程问答--------------------
c#编程很爽,但就是内存增长问题最头痛,PB就没这回事。
C#是开发语言,PB是开发工具,兄台,这么比太业余了。
补充:.NET技术 , C#