1,
ThreadPool.QueueUserWorkItem(new WaitCallback(RUN_SERVER), DS_OLD_real); //线程池 进入函数 DS_OLD_real是DataSet2,
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之间循环;跑久了就会变慢!求解
ThreadPool.QueueUserWorkItem(new WaitCallback(RUN_SERVER), DS_OLD_real); //线程池 进入函数 DS_OLD_real是DataSet2,
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之间循环;跑久了就会变慢!求解
解决方案 »
- C# 做类似于QQ的东东, 有关线程的询问哈, 没多少分,有热心的来看看哈,也许可以难倒你!
- 系列化方法生成XML,如何能排除xsi:type="xsd:string"?
- 如何在新建页打开?
- 请问这个错误是怎么来的?有关C#编绎错误求解!!
- 在C#的继承中,能否在派生类中将基类的成员的访问级别降一个档次,象C++一样
- 我想实现在richtextbox中的text内容写到pdf文件中,......请高手帮我解决该问题
- 如何导出SQL SERVER数据库中的数据到ACCESS中啊?
- 求一个C#的算法,关于数组拷贝
- winform添加新行
- 在有VS的环境下,程序能正常运行,没有的情况下会报错(都有.net framework4.0环境),错误日志如下
- 请教。思路或代码
- 请问如何获取richtextbox控件垂直滚动条的滚动方向?
while(位置相同== true)
{
Thread.Sleep(1000);}
开始运算……
Thread.Sleep(1000);
RUN_SERVER(DS_OLD_real_PATH); //这句作为线程启动执行。让旧的线程结束,启动新的 进程来处理,一直这样交互。
return;
一个方法没有执行到}或return时,局部变量不会回收的
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)
{
//程序运算
}
2,函数的递归调用很奇怪,作为委托方法却被自己的 private方法再次调用。你当然可以这样做,但这不是一个值得推荐的方法。
3,同上面某兄弟。局部变量作用域无法走到尽头,内存永不释放。 其中最严重的应该是cd 这个变量。因为它无法走到最后一个大括号的结尾,所以cd无法释放。(当然,上面兄弟有个疏漏,释放局部变量并非return来决定,很多时候到大括号结尾就释放了。)按我预期的推测,你应该打开任务管理器看看。你会发现你的CPU占用非常低(徘徊在8%-30%)但你的内存消耗却异常严重,只增不减。 如果你打开任务管理器的 ‘选择列’然后勾选 查看句柄 你就会发现你的句柄呈线性递增....
{
//继续执行函数
Thread th = new Thread(new ParameterizedThreadStart(RUN_SERVER));
th.Start(DS_OLD_real_PATH);
return;
}
DataSet 是引用对象,是外界传递进来的,你clear了后面用当然就 未将对象OOXX
要释放的是你的自定义结构,从你给出的代码上要谈优化的话,
你这个不如写 while(true) 写那么绕的递归 太非主流了。
应该是cardData造成的,想办法把它释放了或者不反复new
{
//DataControlEveryData中下面这句删除,不然会产生循环依赖
RUN_SERVER(DS_OLD_real_PATH);
Thread.Sleep(1000);
}
这样写不好吗?
计算位置的方法没运算一次都会返回,
只有返回false是才执行运算的方法。
说到点上,但这还NEW DataSet;谢谢各位,如:8楼 9楼等等 各位!