public void getdata(int b1, int b2, int b3)
        {
            DataSet dt;
            for (int i = b2; i <= b3; i++)
            {
              dt.Tables.Add(returntab(b1));
            }            DataGridView1.DataSource = dt.Tables[b1 + 1];
        }        private void button1_Click(object sender, EventArgs e)
        {
            listView1.Items.Clear();
            int b1 = int.Parse(textBox1.Text.Trim());
            int b2 = int.Parse(textBox2.Text.Trim());
            int b3 = int.Parse(textBox3.Text.Trim());            getdata(b1, b2, b3);
        }上面的代码在执行returntab(b1)方法时可能需要很长时间,
用记在等待时需要实现以下功能:
1.用户在等待时可以取消执行
2.在等待时可以在界面进行其他操作
下午看了一下线程,不甚清楚
3.如果是在其他事件中执行这些代码,那么线程应该如何处理呢大家帮忙

解决方案 »

  1.   

    用Form的 Invoke(Delegate d)
    就可以实现在不同的线程操作控件了;
      

  2.   

    1)把getdata设计成private void getdata(object state){...}函数
    2)在button1事件中使用线程
       (1)ThreadPool.QueueUserWorkItem(getdata);
       (2) Thread t = new Thread(new ThreadStart(getdata));
           t.Start();
    还需要考虑:线程执行结束后如何与主线程通信(回调、同步)
    找《.NET框架设计(第2版)》等数看看。
      

  3.   


    不甚明白
    是要设计成静态方法吗?
    DataGridView1.DataSource = dt.Tables[b1 + 1]; 
    DataGridView1要求对象引用,无法设计成静态方法。
      

  4.   

    建议:1、先理解为什么不能在另外一个线程中更新其它线程(UI线程)创建的控件;
    2、看看C#多线程的编程,理解线程的工作方式,
    3、自己动手写个简单的线程或几个线程的同步,
    4、再用线程去更新你主线程的UI显示
      

  5.   

             delegate void getdataHandler(int b1, int b2, int b3);
            public void getdata(int b1, int b2, int b3) 
            { 
                DataSet dt; 
                for (int i = b2; i <= b3; i++) 
                { 
                  dt.Tables.Add(returntab(b1)); 
                }             DataGridView1.DataSource = dt.Tables[b1 + 1]; 
            }         private void button1_Click(object sender, EventArgs e) 
            { 
                listView1.Items.Clear(); 
                int b1 = int.Parse(textBox1.Text.Trim()); 
                int b2 = int.Parse(textBox2.Text.Trim()); 
                int b3 = int.Parse(textBox3.Text.Trim());             this.Invoke(new getdataHandler(getdata), new object[] { b1, b2, b3 });
            } 
    //上面是基本的写法
      

  6.   

    int[] parameter = new int[3];listView1.Items.Clear(); 
               int.TryParse(textBox1.Text.Trim(),out parameter[0]); 
               int.TryParse(textBox2.Text.Trim(),out parameter[1]); 
               int.TryParse(textBox3.Text.Trim(),out parameter[2]); 
    System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(getdata)); 
                        t.Start(parameter); 
    private void getdata(object sender)
            {
                int[] parameter = sender as int[];
                DataSet dt;
                for (int i = parameter[1]; i <= parameter[2]; i++)
                {
                    Table t = returntab(parameter[0]);
                    dt.Tables.Add(t);
                }            this.Invoke(new MethodInvoker(delegate()
                        {
                            DataGridView1.DataSource = dt.Tables[parameter[0 + 1]; 
                        }));
            }
      

  7.   

    参考以下private class F
    {
        int b1, b2, b3;    public event EventHandler Finished;    public F(int B1, int B2, int B3)
        {
            b1 = B1; b2 = B2; b3 = B3;
        }    public DataTable returntab(int i)
        {
            return new DataTable();
        }    public void getdata(int b1, int b2, int b3)
        {
            DataSet dt = new DataSet();
            for (int i = b2; i <= b3; i++)
            {
                dt.Tables.Add(returntab(b1));
            }        if (Finished != null) Finished(dt.Tables[b1 + 1], null);
            //dataGridView1.DataSource = dt.Tables[b1 + 1];
        }    public void run()
        {
            getdata(b1, b2, b3); 
        }
    }private void button1_Click(object sender, EventArgs e)
    {
        listView1.Items.Clear();
        int b1 = int.Parse(textBox1.Text.Trim());
        int b2 = int.Parse(textBox2.Text.Trim());
        int b3 = int.Parse(textBox3.Text.Trim());    F f = new F(b1, b2, b3);    f.Finished += new EventHandler(f_Finished);    System.Threading.Thread thd = new System.Threading.Thread(new System.Threading.ThreadStart(f.run));
        thd.Start();
        //getdata(b1, b2, b3); 
    }private void f_Finished(object sender, EventArgs e)
    {
        if (dataGridView1.InvokeRequired)
        {
            EventHandler handler = new EventHandler(f_Finished);
            dataGridView1.Invoke(handler, new object[] { sender, e });
        }
        else
        {
            if (sender != null)
            {
                dataGridView1.DataSource = (sender as DataTable);
            }
        }
    }