if (sbFriends.Groups[1].Items.Count < 1)
                        {
                            reader = DBHelper.GetReader(string.Format("select * from users where id={0}", fromUserId[w]));
                            if (reader.Read())
                            {
                                SbItem item = new SbItem(Convert.ToString(reader["NickName"]),
                                Convert.ToInt32(reader["FaceId"]));
                                item.Tag = Convert.ToInt32(reader["id"]);
                                sbFriends.Groups[1].Items.Add(item);
                            }
                            reader.Close();
                            DBHelper.Close();
                        }
                        else
                        {
                            for (int i = 0; i < sbFriends.Groups[1].Items.Count; i++)
                            {
                                if (Convert.ToInt32(sbFriends.Groups[1].Items[i].Tag) == fromUserId[w])
                                {
                                    reader = DBHelper.GetReader(string.Format("select * from users where id={0}", fromUserId[w]));
                                    if (reader.Read())
                                    {
                                        SbItem item = new SbItem(Convert.ToString(reader["NickName"]),
                                        Convert.ToInt32(reader["FaceId"]));
                                        item.Tag = Convert.ToInt32(reader["id"]);
                                        sbFriends.Groups[1].Items.Add(item);
                                    }
                                    reader.Close();
                                    DBHelper.Close();
                                }
                            }
                        }只要注释掉一个IF条件就不卡了,怎么回事

解决方案 »

  1.   

    for (int i = 0; i < sbFriends.Groups[1].Items.Count; i++)
      {
      if (Convert.ToInt32(sbFriends.Groups[1].Items[i].Tag) == fromUserId[w])
      {
      reader = DBHelper.GetReader(string.Format("select * from users where id={0}", fromUserId[w]));
      if (reader.Read())
      {
      SbItem item = new SbItem(Convert.ToString(reader["NickName"]),
      Convert.ToInt32(reader["FaceId"]));
      item.Tag = Convert.ToInt32(reader["id"]);
      sbFriends.Groups[1].Items.Add(item);
      }
      reader.Close();
      DBHelper.Close();
      }
    你看你是循环操作数据库了!    这要1秒链接N次数据库,当然慢了!    不要这样写!
      

  2.   

    for (int i = 0; i < sbFriends.Groups[1].Items.Count; i++)
      {
      if (Convert.ToInt32(sbFriends.Groups[1].Items[i].Tag) == fromUserId[w])
      {
      reader = DBHelper.GetReader(string.Format("select * from users where id={0}", fromUserId[w]));
      if (reader.Read())
      {
      SbItem item = new SbItem(Convert.ToString(reader["NickName"]),
      Convert.ToInt32(reader["FaceId"]));
      item.Tag = Convert.ToInt32(reader["id"]);
      sbFriends.Groups[1].Items.Add(item); //这里还是向你循环的sbFriends.Groups[1].Items增加,明显的死循环
      }
      reader.Close();
      DBHelper.Close();
      

  3.   

    不信把下面的这段代码,做为你的简版,随便写一个应用程序,自己加断点看看,不死机我就不用写代码了
    List<string> list = new List<string>();
                list.Add("1");            for (int i = 0; i < list.Count; i++)
                {
                    list.Add(i.ToString());
                }
      

  4.   

      你把读取数据库的代码写到了 循环里面去了。 
      
        if (reader.Read())
      {
      SbItem item = new SbItem(Convert.ToString(reader["NickName"]),
      Convert.ToInt32(reader["FaceId"]));
      item.Tag = Convert.ToInt32(reader["id"]);
      sbFriends.Groups[1].Items.Add(item);
      }  在这里 每次你也只能取出来一条数据。  应该是把if改成while吧   这样两层循环的话 速度就更慢了 可以考虑换一种方式来做
      

  5.   


    2楼请问这里哪里是死循环?  我就没看出来。
    这个是向第一个组的items添加吧  
      

  6.   

     对的 就是死循环读取数据库。。没得法了。。Fibona说法正确
    俺没看上面  瓜了一盘
      

  7.   

    如果是因为for里面连接数据库比较慢,不如在for外面一次把那个表都取出来,然后循环数据,不用再查数据库了
      

  8.   

    我先不管你的代码是否有错误,首先让它不要影响系统:

    for (int i = 0; i < sbFriends.Groups[1].Items.Count; i++)
      {这句替换成:
    int _Count = sbFriends.Groups[1].Items.Count;
    for (int i = 0; i < _Count ; i++)
    {
        Application.DoEvents();