c#长时间循环时内存泄露问题

quilt1120p 2012-07-04 08:36:10
我想实现的功能是 ,按一下键程序执行循环,直到按停止键为止
但是如果长时间不按停止按钮,程序会越来越慢,直到电脑内存耗尽。问题应该在while循环中、求高人帮忙解决这问题,不胜感激!。


这是开始键的程序

private void StartCalcButton_Click(object sender, EventArgs e)
{

string printbox = string.Empty;
string challengetext=string.Empty;
StopFlag = false;
if (ScLboxDataValue>EcLboxDataValue)
{
this.PrintBox.Items.Clear();
this.PrintBox.Items.Add(" Start Challenge is larger than End Challenge");
this.PrintBox.SelectedIndex = this.PrintBox.Items.Count - 1;
return;
}
ValueCompare compare = new ValueCompare();
Encryption5Byte a = new Encryption5Byte();
Encryption10Byte b = new Encryption10Byte();
while ((compare.ChallengeChangeValueCompareAction(this) != ">") && (StopFlag == false))
{
StopCalcButton.Enabled = true;
StartCalcButton.Enabled = false;
ClearButton.Enabled = false;
ResetButton.Enabled = false;
parameter.Enabled = false;
KeyLengthSelect.Enabled = false;
ClearButton.Focus();
Challenge[0] = Convert.ToByte((byte)counter1);
Challenge[1] = Convert.ToByte((byte)(counter1 >> 8));
Challenge[2] = Convert.ToByte((byte)(counter1 >> 16));
Challenge[3] = Convert.ToByte((byte)(counter1 >> 24));
Challenge[4] = Convert.ToByte((byte)(counter1 >> 32));
if (_5Byteskey.Checked == true)
{
a.GetSignatureBufAction1(Challenge, KeyPage4boxDataBuf, Signature);
}
else
{
b.GetSignatureBufAction2(Challenge, Signature, KeyPage4boxDataBuf, KeyPage5boxDataBuf);
}
for (int j = 4; j >= 0; j--)
{
if (Challenge[j] < 16)
challengetext += "0" + Convert.ToString(Challenge[j], 16) + " ";
else
challengetext += Convert.ToString(Challenge[j], 16) + " ";

}
for (int i = 2; i >= 0; i--)
{
if (Signature[i] < 16)
printbox += " " + "0" + Convert.ToString(Signature[i], 16);
else
printbox += " " + Convert.ToString(Signature[i], 16);
}
//ListBox表示
printbox += " " + challengetext;
this.PrintBox.Items.Add(printbox.ToUpper());
this.PrintBox.SelectedIndex = this.PrintBox.Items.Count - 1;
printbox = null;
challengetext = null;
Application.DoEvents();
counter1++;
GC.Collect();
// GC.WaitForPendingFinalizers();
//Dispose();
//GC.SuppressFinalize(this);
}
StartCalcButton.Enabled = true;
ClearButton.Enabled = true;
ResetButton.Enabled = true;
StopCalcButton.Enabled = false;
if (StopFlag == true)
{
this.PrintBox.Items.Add(" Calculation stoped,the counter will not be reset");
this.PrintBox.SelectedIndex = this.PrintBox.Items.Count - 1;

}
if (StopFlag == false)
{
parameter.Enabled = true;
KeyLengthSelect.Enabled = true;
counter1 = ScLboxDataValue;
this.PrintBox.Items.Add(" Calculation complete");
this.PrintBox.SelectedIndex = this.PrintBox.Items.Count - 1;
}
return;
}


这是停止键程序

private void StopCalcButton_Click(object sender, EventArgs e)
{
StopFlag = true;
}

...全文
760 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
quilt1120p 2012-07-06
  • 打赏
  • 举报
回复
问题解决了
这条语句的问题 this.PrintBox.Items.Add(printbox.ToUpper());
应该是listbox的 items超出最大值了
我在循环每循环50000次执行一次this.PrintBox.Items.Clear()就不会出现内存被占用越来越多的情况了
谢谢楼上各位的回答。
  • 打赏
  • 举报
回复
靠按钮来停止跟死循环有什么区别?而且循环里不停地给控件复制,这个控件就一直不能释放,所占用的内存就会越来越大,时间一长肯定会卡死的。应该要限制的
tanta 2012-07-05
  • 打赏
  • 举报
回复
自动内存回收不及时,可以有几个办法:
1、主动释放占用的内存和资源,如dispose等;
2、调用系统的回收机制主动回收,而不是等待系统自动回收。
家里PC没装C#,只能帮这些了。。。
SocketUpEx 2012-07-05
  • 打赏
  • 举报
回复
如果是必然重现的bug,是最好修改的了
mmmmtest 2012-07-05
  • 打赏
  • 举报
回复
应该还有其他的办法,只是你思路不对
quilt1120p 2012-07-05
  • 打赏
  • 举报
回复
如果不加 Application.DoEvents()的话,在循环过程中无法响应其它按键啊
quilt1120p 2012-07-05
  • 打赏
  • 举报
回复
我创建对象是在while循环外面的啊
ValueCompare compare = new ValueCompare();
Encryption5Byte a = new Encryption5Byte();
Encryption10Byte b = new Encryption10Byte();
这些对象的创建不是在while循环里边啊。
兔子-顾问 2012-07-05
  • 打赏
  • 举报
回复
垃圾回收也是个线程,你需要让循环中sleep(0)给垃圾回收一个抢到cpu时间片的机会。
YapingXin 2012-07-05
  • 打赏
  • 举报
回复

首先你是否需要在这个无限循环里面不断地创建新对象?是否真的有这个必要?能不能在循环体的外面创建这个对象,在循环体里面仅仅是不断地Fill这个对象??

如果实在避免不了在循环体里面创建新对象,那么应该在循环体里面也负责清除这个对象,C#明明有Dispose机制,你为什么不用??

所以这真的是你自己编程欠缺考虑,不是.Net内存溢出了。
YapingXin 2012-07-05
  • 打赏
  • 举报
回复
首先楼主要正确描述问题,是内存耗尽,不是内存泄露.内存泄露的话是.Net内存管理机制出现严重的问题,内存耗尽则是写程序的人自己没有控制好,这是不同性质的问题,楼主不要把自己的问题转嫁到微软的头上.


如果仅仅是做一个死循环,那么无论如何都不可能耗尽内存,关键是你在循环体里面都干了些神马事情.

你在一个基本上无限循环的循环体里面,只知道申请内存来创建新对象,而从来不负责对这些新对象进行及时的清理,那么你当然会把内存耗尽了,这是用脚趾头想也能想明白的事,对吧.
缭绕飘渺 2012-07-04
  • 打赏
  • 举报
回复
Application.DoEvents();
可怜的代码
可怜的小孩啊
思路不对
quilt1120p 2012-07-04
  • 打赏
  • 举报
回复
加了thread.sleep 延迟一段时间 ,好像木有效果
rayyu1989 2012-07-04
  • 打赏
  • 举报
回复
适当thread.sleep下
  • 打赏
  • 举报
回复
只会“循环”这是一种非常懒惰的习惯在作怪。你想想,如果更加“自然”的控制不是循环,那么会是什么?

用户流程中的循环,如果让你设计程序流程时你也只知道while循环,那么就不行了。设计程序的人总应该有高于不懂编程的人的技术,所以他不用while循环。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧