首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

c#winfrom 利用多线程插入数据 出现重复有关问题

2013-09-05 
c#winfrom 利用多线程插入数据 出现重复问题DataTable dtBindingSource bsprivate void Form1_Load(obje

c#winfrom 利用多线程插入数据 出现重复问题


        DataTable dt;
        BindingSource bs;
        private void Form1_Load(object sender, EventArgs e)
        {
            dt = new DataTable();
            dt.Columns.Add("id", typeof(string));
            dt.Columns.Add("aa", typeof(string));
            dt.Columns.Add("a", typeof(string));
            dt.Columns.Add("b", typeof(string));
            dt.Columns.Add("c", typeof(string));
            dt.Columns.Add("d", typeof(string));


            bs = new BindingSource();
            bs.DataSource = dt;
            this.dataGridView1.DataSource = bs;

        }
        string sturl;
        int ip = 10;
        private void button1_Click(object sender, EventArgs e)
        {
            //sturl = "http://127.0.0.1/MidasEvents1.htm";
            //GetWebContent();
            weburl wb;
            for (int i = 1; i <= 50; i++)
            {
                ip++;
                sturl = "http://127.0.0.1/MidasEvents" + i + ".htm";
                wb=new weburl(sturl, ip, dt);
            }



        }

         class weburl
        {
            MatchCollection mc;
            DataRow dr;
            int t = 0;
            int sum = 0;
         string sturl;
         int ip;
         DataTable dt;
         public weburl(string stu,int p, DataTable ddt)
         {
             sturl = stu;
             ip = p;
             dt = ddt;
             //创建线程   
             Thread thread = new Thread(new ThreadStart(GetWebContent));   
             thread.Name = "Thread"+p.ToString();   
             thread.Start();
         }
        private void GetWebContent() 
        {
            t++;  
            try { 
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(sturl);
                //声明一个HttpWebRequest请求 
                //request.Timeout = 10000; 
                //设置连接超时时间 
                request.Headers.Set("Pragma", "no-cache"); 
                HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 


                Stream streamReceive = response.GetResponseStream(); 
                Encoding encoding = Encoding.GetEncoding("utf-8"); 
                StreamReader streamReader = new StreamReader(streamReceive, encoding);
                mc = Regex.Matches(streamReader.ReadToEnd(), @"(?i)(?<=<font.*?>)[^<]+(?=</font>)");
                for (int i = 0; i < 4; i++)
                {
                     t++;
                    dr = dt.NewRow();
                    dr["id"] = t.ToString();
                    dr["aa"]="192.168.1."+ip.ToString();
                    dr["a"] = mc[sum++].Groups[0].Value.Trim().Replace("/n", "").ToString();
                    dr["b"] = mc[sum++].Groups[0].Value.Trim().Replace("/n", "").ToString();
                    dr["c"] = mc[sum++].Groups[0].Value.Trim().Replace("/n", "").ToString();
                    dr["d"] = mc[sum++].Groups[0].Value.Trim().Replace("/n", "").ToString();
                    dt.Rows.Add(dr);
                    
                }
                sum =0;
            }


            catch (Exception ex)
            { 
                MessageBox.Show(ex.ToString());
            } 

        } 
         }




主要功能是 根据网页地址去读取网页,并获取一些内容,并保存到datatable

执行一个正常,用线程就报错了,数据不对头,
还有行鞥方面不知道怎么优化


效果如下

编号     id          名称    类型    数值   报警
1     192.168.1.11   ah    bb     c4     d8
2     192.168.1.12   af    bg     c2     d7
3     192.168.1.13   as    bh     c1     d7




[解决办法]
MatchCollection mc;
            DataRow dr;
            int t = 0;
            int sum = 0;
         string sturl;
         int ip;
         DataTable dt;

这些变量在多个线程内共享,当然程序会出错。
[解决办法]
尤其是mc。a线程正要读呢,b线程改写了,自然取的重复了。

你这个程序根本不对,先找本书补充下基础知识再说吧。
[解决办法]
多线程的话,你应该把待插入的数据分组,不同的线程插入不同的数据吧?
[解决办法]
看起来还不错了,只是DataTable dt的共享没处理好,加把锁就好:


                for (int i = 0; i < 4; i++)


                {
                     t++;
                    lock(dt)
                    {
                        dr = dt.NewRow();
                        dr["id"] = t.ToString();
                        dr["aa"]="192.168.1."+ip.ToString();
                        dr["a"] = mc[sum++].Groups[0].Value.Trim().Replace("/n", "").ToString();
                        dr["b"] = mc[sum++].Groups[0].Value.Trim().Replace("/n", "").ToString();
                        dr["c"] = mc[sum++].Groups[0].Value.Trim().Replace("/n", "").ToString();
                        dr["d"] = mc[sum++].Groups[0].Value.Trim().Replace("/n", "").ToString();
                        dt.Rows.Add(dr);
                    } 
                }

热点排行