winform 使用线程

Posted on 2017-04-12 14:51  熊先生丶  阅读(167)  评论(0编辑  收藏  举报

我这里写一个线程里创建一个窗体调用父窗体的方法

      private void button4_Click(object sender, EventArgs e)
        {
            button4.Text = "正在加载中";
            button4.Enabled = false;
            Thread t = new Thread(new ThreadStart(open));  // 创建线程
            t.Start();  //线程开始
          
        }
        public void ssss()
        {

            button4.Text = "确认";
            button4.Enabled = true;
        
        }
        public delegate void xxxxx(); //定义委托
        public void ssxx()     //winfrom 中不管是不是同一个窗体跨线程访问都会报安全问题,所有需要委托窗体线程来做
        {
            xxxxx x = new xxxxx(ssss);

            this.Invoke(x);
        }
        public void open()
        {
            List<string> ls = new List<string>();
            for (int i = 0; i < dataGridView1.Rows.Count; i++)
            {
                if (Convert.ToBoolean(dataGridView1.Rows[i].Cells[0].Value))
                {
                    // MessageBox.Show(dataGridView1.Rows[i].Cells[2].Value.ToString());
                    ls.Add(dataGridView1.Rows[i].Cells[1].Value.ToString());


                }



            }

            if (ls.Count <= 0)
            {
                MessageBox.Show("请先选择");
                ssxx();
                return;

            }
            List<string> lstr = Class1.readzswj(mo.dr, mo.gz, ls);
            if (lstr.Count <= 0)
            {
                MessageBox.Show("选中文件中没有表通过验证,请重新选择");
                ssxx();
             return;
            }
           
            xxxxx x = new Form4.xxxxx(ssxx);    //与我另一篇文章一样
          Form12 f = new Form12(mo,ls,x,lstr);
          f.ShowDialog(); //注意这里要用是这个  不能只是show() 线程做完事情后自动释放,这里窗体也会被释放掉
        
        }