for循环启动多线程

create_code 2020-05-14 03:22:48
在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,导致数组越界错误,这个代码应该怎么改,请大家指点
...全文
511 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
create_code 2020-05-15
  • 打赏
  • 举报
回复
看了一楼的方法,用把for换成Parallel.For就可以了,不需要创建线程,并行for循环。
wanghui0380 2020-05-14
  • 打赏
  • 举报
回复
Task.Factory.StartNew(参数 => { },参数)
杀马特丶蛮牛 2020-05-14
  • 打赏
  • 举报
回复
直接点吧,运行这段代码,最后输出全是20

for (int mi = 0; mi < 20; mi++)
            {
                Task.Factory.StartNew(() =>
                {
                    Thread.Sleep(10);
                    Console.WriteLine(mi);
                });
            }
            Console.ReadKey();
杀马特丶蛮牛 2020-05-14
  • 打赏
  • 举报
回复
看看这段代码,明白啥意思了吧

int mi = 0;
            for (; mi < 20; mi++)
            {
            }
            Console.WriteLine(mi);//这里输出的mi是20
大鱼> 2020-05-14
  • 打赏
  • 举报
回复
for里面写线程,这个操作不好控制啊。 这个能否满足你的需求? https://blog.csdn.net/smartsmile2012/article/details/72548981

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧