for循环启动多线程
在winform程序中首先开启了一个子线程,想在子线程的for循环中再开启多个线程,结果出现了异常现象,代码如下
IpLocation[] IpLcat = new IpLocation[20];
Task[] task = new Task[20];
string[] ip = new string[20];
IPResult[] IpRst = new IPResult[20];
string[] filenames = new string[20] { "a1.bin", "a2.bin", "a3.bin", "a4.bin", "a5.bin", "a6.bin", "a7.bin", "a8.bin", "a9.bin", "a10.bin", "a11.bin",
"a12.bin", "a13.bin", "a14.bin", "a15.bin", "a16.bin", "a17.bin", "a18.bin", "a19.bin", "a20.bin" };
for (int mi = 0; mi < 20; mi++)
{
task[mi] = new Task(() => {
IpLcat[mi] = new IpLocation(Application.StartupPath+ "\\" + filenames[mi]);
for (int i = mi * 1000; i < (mi + 1) * 1000; i++)
{
DataRow dr = dt.NewRow();
ip[mi] = ipdata[i].Replace("zproxy.lum-superproxy.io:22225:" + AccountPerfix, "").Replace(":" + apwd, "");
IpRst[mi] = IpLcat[mi].ReadIpBin(ip[mi]);
dr["序号"] = (i + 1).ToString();
dr["备注"] = "";
dr["IP地址"] = ip[mi];
dr["国家"] = IpRst[mi].CountryShort;
dr["州省"] = IpRst[mi].Region;
dr["城市"] = IpRst[mi].City;
dr["邮编"] = IpRst[mi].ZipCode;
dr["数据"] = "data" + i;
dr["时区"] = IpRst[mi].TimeZone;
dr["UserAgent"] = uadata[rd.Next(0, uadata.Count)];
lock (locker)
{
dt.Rows.Add(dr);
}
if (mi == 19)
{
label_info.BeginInvoke(new Action(() =>
{
label_info.Text = "已加载" + i.ToString();
}));
}
}
});
task[mi].Start();
}
这个变量mi在循环内部会跑到20,导致数组越界错误,这个代码应该怎么改,请大家指点