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之间循环;跑久了就会变慢!求解

解决方案 »

  1.   


    while(位置相同== true)
    {
        Thread.Sleep(1000);}
    开始运算……
      

  2.   

    有没有发现你运行的越久 内存占用越来越大?你这样处理有点类似了递归一直每个尾数。你要跳出来,简单的改法是。把这里
    Thread.Sleep(1000);
      RUN_SERVER(DS_OLD_real_PATH);  //这句作为线程启动执行。让旧的线程结束,启动新的 进程来处理,一直这样交互。
      return;
      

  3.   

    是局部变量不断堆积造成的
    一个方法没有执行到}或return时,局部变量不会回收的
      

  4.   

    有没有原因 是dataset 没释放 
      

  5.   

    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)
      {
        //程序运算
      }
      

  6.   

    1,可以不用ThreadPool。需要提升速度可以自己写多线程。
    2,函数的递归调用很奇怪,作为委托方法却被自己的 private方法再次调用。你当然可以这样做,但这不是一个值得推荐的方法。
    3,同上面某兄弟。局部变量作用域无法走到尽头,内存永不释放。 其中最严重的应该是cd 这个变量。因为它无法走到最后一个大括号的结尾,所以cd无法释放。(当然,上面兄弟有个疏漏,释放局部变量并非return来决定,很多时候到大括号结尾就释放了。)按我预期的推测,你应该打开任务管理器看看。你会发现你的CPU占用非常低(徘徊在8%-30%)但你的内存消耗却异常严重,只增不减。 如果你打开任务管理器的 ‘选择列’然后勾选 查看句柄 你就会发现你的句柄呈线性递增....
      

  7.   

      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;
      }
      

  8.   

    好像没什么可释放的!就一个 DataSet 和 自定义结构!我用异步,在2函数尾巴,对 DataSet 做 clear();dispose();发现 释放后,3执行到DataSet 被释放时候,就出问题了!找不到对象!  
      

  9.   


    DataSet 是引用对象,是外界传递进来的,你clear了后面用当然就 未将对象OOXX
    要释放的是你的自定义结构,从你给出的代码上要谈优化的话,
    你这个不如写 while(true) 写那么绕的递归 太非主流了。
      

  10.   

    看你这个问题 
    应该是cardData造成的,想办法把它释放了或者不反复new
      

  11.   

    内存未得到释放造成的。感觉是只递不归。看你这个咋像GPS导航系统。建议后台线程跑:while(true)
    {
      //DataControlEveryData中下面这句删除,不然会产生循环依赖
      RUN_SERVER(DS_OLD_real_PATH);
      Thread.Sleep(1000);
    }
      

  12.   


    这样写不好吗?
    计算位置的方法没运算一次都会返回,
    只有返回false是才执行运算的方法。
      

  13.   


    说到点上,但这还NEW  DataSet;谢谢各位,如:8楼 9楼等等 各位!