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);
}
}