在winform中。直接上代码!        private void btnAddIdx_Click(object sender, EventArgs e)
        {
            //CreateIndex();
            Thread thread = new Thread(new ThreadStart(CreateIndex));
            thread.IsBackground = true;
            thread.Start();
        }
private void CreateIndex()
{
    SqlDataReader myred = GetSource();  
    try
            {
                while (myred.Read())
                {
                   //里面是对读出的数据进行处理
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
}
报错为:
索引超出范围。必须为非负值并小于集合大小。
参数名: index而且是在处理了一部分数据之后出现的,每次处理的条数都不一样。
直接调用CreateIndex() 不会出错,但是界面会卡死。使用线程就会出现这个错误!
高手们麻烦解释一下。谢谢!

解决方案 »

  1.   

                private   void   btnAddIdx_Click(object   sender,   EventArgs   e)
                    {
                            //CreateIndex();
                            Thread   thread   =   new   Thread(new   ThreadStart(CreateIndex));
                            thread.IsBackground   =   true;
                            thread.Start();
                    }
    private   void   CreateIndex()
    {
            SqlDataReader   myred   =   GetSource();    
            try
                            {
                                    while   (myred.Read())
                                    {
                                          //里面是对读出的数据进行处理
                                    }
                            }
                            catch   (Exception   ex)
                            {
                                    MessageBox.Show(ex.Message);
                            }
      

  2.   


    //将里面的数据写到文本中。
    //使用方法 
    WriteFile("path",myred["Content"].ToString());
      

  3.   

    看这段代码应该用的没有全局资源,可以不用lock
    但不知道
    while   (myred.Read()) 
                                    { 
                                          //里面是对读出的数据进行处理 
                                    } 
    里边到底是什么代码?有没有用到全局变量?
      

  4.   

    貌似这哥们 委托没有 。像你那样貌似会出问题 你先把你那个方法。我也是刚学线程和委托 了 
    http://www.cnblogs.com/warensoft/archive/2010/03/19/1689806.html建议还是先看看吧
      

  5.   

    问题肯定处在GetSource();
    和写文件的地方这俩部分代码不贴出来是看不出来的,全局资源要lock一下。
      

  6.   

     GetSource();    里怎么写的
      

  7.   


    /// <summary>
            /// 获取数据源
            /// </summary>
            /// <returns></returns>
            private SqlDataReader GetSource()
            {
                SqlConnection con = new SqlConnection("server=.;database=TestDB;uid=sa;pwd=123");
                con.Open();
                SqlCommand cmd = new SqlCommand(string.Format("select {0} from Testtbl", txtShowStr.Text), con);
                return cmd.ExecuteReader();
            }
    private   void   CreateIndex()
    {
            SqlDataReader   myred   =   GetSource();    
            try
                            {
                                    while   (myred.Read())
                                    {
                                          WriteFile("path",myred["Content"].ToString());  
                                    }
                            }
                            catch   (Exception   ex)
                            {
                                    MessageBox.Show(ex.Message);
                            }
    } //WriteFile其实就是使用File.AppendAllText;当然myred["Content"]是作了一下字符串替换和组合,不是一个字段,而是读出来的数据字段。
      

  8.   

    错误是出现在Main里面的,我就是奇怪了。
    debug报错是停在Application.Run(new MainFrm());这句。
    报错为:
    索引超出范围。必须为非负值并小于集合大小。
    参数名:   index 
    所以我无法找到,是不是资源被提前释放了。不得而知!
      

  9.   

    WriteFile 写的是同一个文件么
      

  10.   

    帖子移转http://topic.csdn.net/u/20111121/10/ef26d117-8850-407b-b77f-416924b1b500.html
      

  11.   

    线程里面放SqlDataReader不恰当吧。