代码越跑越慢,求高人解!

l171147904 2010-07-08 03:12:24
1,
ThreadPool.QueueUserWorkItem(new WaitCallback(RUN_SERVER), DS_OLD_real); //线程池 进入函数 DS_OLD_real是DataSet

2,
private void RUN_SERVER(object obj)
{
//获取本车子最优路线数据集
DataSet DS_OLD_real_PATH = (DataSet)obj;

//读取本车子当前所在的位置
string realP = ***// SOCKET取得值;

cardData cd = new cardData();//cardData 是一个自定义结构
cd.cardID = DS_OLD_real_PATH.Tables[0].Rows[lastR]["cardID"].ToString();
cd.mapID = DS_OLD_real_PATH.Tables[0].Rows[lastR]["mapID"].ToString();
cd.crossingID = realP; //当前路口
cd.destinationID = DS_OLD_real_PATH.Tables[0].Rows[lastR]["end"].ToString();
cd.VISTOR_ID = DS_OLD_real_PATH.Tables[0].Rows[lastR]["VISTOR_ID"].ToString();

DataControlEveryData(cd, DS_OLD_real_PATH);
}

3,
private void DataControlEveryData(cardData de_All, DataSet DS_OLD_real_PATH)
{
//取的前一次到达行车点
DS_OLD_real_PATH.Tables[1].DefaultView.Sort = "time desc"; //实际行车路线cardID,
//当前行车位置,和上次行车位置同一位置上
if (DS_OLD_real_PATH.Tables[1].DefaultView[0]["crossing"].ToString() == de_All.crossingID)
{
//继续执行函数
Thread.Sleep(1000);
RUN_SERVER(DS_OLD_real_PATH);
return;
}
//程序运算
}


我的程序测试,一直让它在 2,3之间循环;跑久了就会变慢!求解
...全文
574 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
l171147904 2010-07-12
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 chichenzhe 的回复:]
1,可以不用ThreadPool。需要提升速度可以自己写多线程。
2,函数的递归调用很奇怪,作为委托方法却被自己的 private方法再次调用。你当然可以这样做,但这不是一个值得推荐的方法。
3,同上面某兄弟。局部变量作用域无法走到尽头,内存永不释放。 其中最严重的应该是cd 这个变量。因为它无法走到最后一个大括号的结尾,所以cd无法释放。(当然,上面兄弟有个疏漏,释放局部变量并非return……
[/Quote]

说到点上,但这还NEW DataSet;

谢谢各位,如:8楼 9楼等等 各位!
Code従業員 2010-07-09
  • 打赏
  • 举报
回复
内存未得到释放造成的。感觉是只递不归。

看你这个咋像GPS导航系统。。。。

建议后台线程跑:

while(true)
{
//DataControlEveryData中下面这句删除,不然会产生循环依赖
RUN_SERVER(DS_OLD_real_PATH);
Thread.Sleep(1000);
}
ztlover 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sh_zhuting 的回复:]
引用 7 楼 l171147904 的回复:
行车引导系统,基本逻辑:

取当前车所在位置,判断是否和上次车所在位置相同;
1 是,过1秒,继续取最新车所在位置,继续判断
2 否,开始运算,并把当前点,插入实际行车路线


while(位置相同== true)
{
Thread.Sleep(1000);

}
开始运算……
[/Quote]

这样写不好吗?
计算位置的方法没运算一次都会返回,
只有返回false是才执行运算的方法。
royalli 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sh_zhuting 的回复:]
方法2调用方法3,方法3调用方法2
导致方法2、方法3永远不会返回,方法2和3中的对象不断的被创建,而不能回收!
因此越来越慢
[/Quote]

是这个道理!
slicy 2010-07-08
  • 打赏
  • 举报
回复
smthgdin_020 2010-07-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 skyland84 的回复:]
有没有发现你运行的越久 内存占用越来越大?

你这样处理有点类似了递归一直每个尾数。

你要跳出来,简单的改法是。把这里
Thread.Sleep(1000);
RUN_SERVER(DS_OLD_real_PATH); //这句作为线程启动执行。让旧的线程结束,启动新的 进程来处理,一直这样交互。
return;
[/Quote]

嗯。
cancerser 2010-07-08
  • 打赏
  • 举报
回复
看你这个问题
应该是cardData造成的,想办法把它释放了或者不反复new
planet 2010-07-08
  • 打赏
  • 举报
回复
看看~
chichenzhe 2010-07-08
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 l171147904 的回复:]

好像没什么可释放的!就一个 DataSet 和 自定义结构!

我用异步,在2函数尾巴,对 DataSet 做 clear();dispose();发现 释放后,3执行到DataSet 被释放时候,就出问题了!找不到对象!
[/Quote]

DataSet 是引用对象,是外界传递进来的,你clear了后面用当然就 未将对象OOXX
要释放的是你的自定义结构,

从你给出的代码上要谈优化的话,
你这个不如写 while(true) 写那么绕的递归 太非主流了。
zhubo006 2010-07-08
  • 打赏
  • 举报
回复
myhope88 2010-07-08
  • 打赏
  • 举报
回复
不懂,学习下
l171147904 2010-07-08
  • 打赏
  • 举报
回复
好像没什么可释放的!就一个 DataSet 和 自定义结构!

我用异步,在2函数尾巴,对 DataSet 做 clear();dispose();发现 释放后,3执行到DataSet 被释放时候,就出问题了!找不到对象!
一步一码 2010-07-08
  • 打赏
  • 举报
回复
可能和内存的释放有关系
guyehanxinlei 2010-07-08
  • 打赏
  • 举报
回复
资源使用完第一时间释放掉
铛铛 2010-07-08
  • 打赏
  • 举报
回复
if (DS_OLD_real_PATH.Tables[1].DefaultView[0]["crossing"].ToString() == de_All.crossingID)
{
//继续执行函数
Thread th = new Thread(new ParameterizedThreadStart(RUN_SERVER));
th.Start(DS_OLD_real_PATH);
return;
}
chichenzhe 2010-07-08
  • 打赏
  • 举报
回复
1,可以不用ThreadPool。需要提升速度可以自己写多线程。
2,函数的递归调用很奇怪,作为委托方法却被自己的 private方法再次调用。你当然可以这样做,但这不是一个值得推荐的方法。
3,同上面某兄弟。局部变量作用域无法走到尽头,内存永不释放。 其中最严重的应该是cd 这个变量。因为它无法走到最后一个大括号的结尾,所以cd无法释放。(当然,上面兄弟有个疏漏,释放局部变量并非return来决定,很多时候到大括号结尾就释放了。)

按我预期的推测,你应该打开任务管理器看看。你会发现你的CPU占用非常低(徘徊在8%-30%)但你的内存消耗却异常严重,只增不减。 如果你打开任务管理器的 ‘选择列’然后勾选 查看句柄 你就会发现你的句柄呈线性递增....



l171147904 2010-07-08
  • 打赏
  • 举报
回复
也许9楼的是 不错办法! 高人继续给思路!
l171147904 2010-07-08
  • 打赏
  • 举报
回复
2,
private void RUN_SERVER(object obj)
{
//获取本车子最优路线数据集
DataSet DS_OLD_real_PATH = (DataSet)obj;

//读取本车子当前所在的位置
string realP = ***// SOCKET取得值;车最新位置

//判断当前行车位置 和 上次行车位置是否同一位置上
bool retValue = GetOldNewPart(ref realP, DS_OLD_real_PATH.Tables[1].DefaultView[0]["crossing"].ToString(), realP, DS_OLD_real_PATH.Tables[0].Rows[lastR]["cardID"].ToString(), 0);
if (retValue == false)
{
return;
}


cardData cd = new cardData();//cardData 是一个自定义结构
cd.cardID = DS_OLD_real_PATH.Tables[0].Rows[lastR]["cardID"].ToString();
cd.mapID = DS_OLD_real_PATH.Tables[0].Rows[lastR]["mapID"].ToString();
cd.crossingID = realP; //当前路口
cd.destinationID = DS_OLD_real_PATH.Tables[0].Rows[lastR]["end"].ToString();
cd.VISTOR_ID = DS_OLD_real_PATH.Tables[0].Rows[lastR]["VISTOR_ID"].ToString();

DataControlEveryData(cd, DS_OLD_real_PATH);
}

4,
protected bool GetOldNewPart(ref string realP,string oldPart,string newPart,string cardID,int count)
{
if (count == 7200)
{
return false;
}
count += 1;
if (oldPart.Trim() == newPart.Trim())
{
Thread.Sleep(1000);
newPart = ***// SOCKET取得值;车最新位置
if (newPart == "")
{
return false;
}
else
{
GetOldNewPart(ref realP, oldPart, newPart, cardID, count);
newPart = realP;
}
}
realP = newPart;
return true;
}

3,变:
private void DataControlEveryData(cardData de_All, DataSet DS_OLD_real_PATH)
{
//程序运算
}
l171147904 2010-07-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 skyland84 的回复:]
有没有发现你运行的越久 内存占用越来越大?

你这样处理有点类似了递归一直每个尾数。

你要跳出来,简单的改法是。把这里
Thread.Sleep(1000);
RUN_SERVER(DS_OLD_real_PATH); //这句作为线程启动执行。让旧的线程结束,启动新的 进程来处理,一直这样交互。
return;
[/Quote]

第一感觉 可行!

我现在把:3,//当前行车位置,和上次行车位置同一位置上
放入2 进行判断;写个递归一直判断,直到不等适合返回(避免创建任何对象)

好像可行,还带压力测试!
两浙子弟 2010-07-08
  • 打赏
  • 举报
回复
有没有原因 是dataset 没释放
加载更多回复(12)

110,538

社区成员

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

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

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