先看代码吧 public void Auto()
{
if (checkBox6.Checked == false)
return; auPros = Process.GetProcesses();
Myexist = false;
foreach (Process tempPoc in auPros)
{
if (tempPoc.ProcessName == "vmware")
{
Myexist = true;
break;
}
} if (checkBox6.Checked == false)
return; if (Myexist && !aut)
{
aut = true;
AutoStart();
} if (checkBox6.Checked == false)
return; if (!Myexist && aut)
{
aut = false;
AutoStop();
} if (checkBox6.Checked == false)
return; Thread.Sleep(1000); Auto();
}
只要这个线程一启动,我程序的内存就不停的涨 从27mb一直到500mb左右才被回收一次(突然间到200mb然后继续涨)
现在我认为是这个递归调用占用了内存 而且不释放。。 希望大家帮帮我 我要怎么解决
补充下 我认为只要一 return 线程就结束了(这是由用户决定的)
递归事实上是可以随时终止的 所以我觉得在这个线程中没有必要纠缠死循环的问题(事实上vs2008也没有报错 提示这段代码存在死循环的问题)
{
if (checkBox6.Checked == false)
return; auPros = Process.GetProcesses();
Myexist = false;
foreach (Process tempPoc in auPros)
{
if (tempPoc.ProcessName == "vmware")
{
Myexist = true;
break;
}
} if (checkBox6.Checked == false)
return; if (Myexist && !aut)
{
aut = true;
AutoStart();
} if (checkBox6.Checked == false)
return; if (!Myexist && aut)
{
aut = false;
AutoStop();
} if (checkBox6.Checked == false)
return; Thread.Sleep(1000); Auto();
}
只要这个线程一启动,我程序的内存就不停的涨 从27mb一直到500mb左右才被回收一次(突然间到200mb然后继续涨)
现在我认为是这个递归调用占用了内存 而且不释放。。 希望大家帮帮我 我要怎么解决
补充下 我认为只要一 return 线程就结束了(这是由用户决定的)
递归事实上是可以随时终止的 所以我觉得在这个线程中没有必要纠缠死循环的问题(事实上vs2008也没有报错 提示这段代码存在死循环的问题)
解决方案 »
- C# Socket 通过网络远程连接 发送接收字符!
- C#如何对文件夹加密和解密(会的定有报酬)
- 两个窗体之间的问题
- 请问用C#怎样实现去除一串数字前面的0,在线等
- 请教各位大仙帮帮忙,我是C#写的采集声卡数据,声卡是外置USB声卡,但是每次采集的时候必须先运行我的程序,然后在程序运行的时候拔插一下声卡,关闭我程序,再运行,采集到的数据才有声音
- C#学习网站有哪些
- 正则表达式找出两个特定字符之间的内容
- 疑难杂症:Webbrowser访问某些网页脚本执行不成功的问题
- 100分求教从数据库中读取图片的方法
- c#,关于后台多线程问题
- 如何在gridview中的combobox绑定数据库
- 打印机的打印问题
试试删掉过程中的Auto调用
直接
for(;;)
{
Auto();
}
看看是不是效果会更好点?
{
Auto();
}
while(stack.Count>0)
{
参数= stack.Pop();
方法(参数);//方法中需要调用自身时,只需要把参数Push到这个stack就可以直接退出了.
}对于次数太多的递归,可以试试上面的方法
如果你认为30M足够使用,可以先设置内存最大使用的值,避免内存过大。你可以不修改你的函数,调用的时候进行设置:
IntPtr old = Process.GetCurrentProcess().MaxWorkingSet;
Process.GetCurrentProcess().MaxWorkingSet = (IntPtr)(30 * 1024 * 1024);
Auto();
Process.GetCurrentProcess().MaxWorkingSet = old;或是在你的Auto的第一行加上:
GC.Collect();
但是使用while语句 真的是个不错的主意
我去试试 (感觉用while应该可以解决问题) 谢谢大家
十分感谢以上各位的回帖!
结贴 给分