多线程时i的值错误
本文关键字:错误 多线程 | 更新日期: 2023-09-27 18:12:32
我正在尝试使用多线程调用此函数。当我运行程序时,我得到一个异常"索引超出范围"。当我尝试打印' I '的值时,我得到serviceids列表。每次计数。
在我的例子中,循环应该从0到1并打印这次i的值是0这次i的值是1
但是它打印两次
这次i的值是2这次i的值是2
我的代码有什么问题,我该如何修复它?dataddownloader downloader = new dataddownloader ();
for (int i = 0; i < serviceidslist.Count; i++)
{
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += new DoWorkEventHandler(
delegate(object o, DoWorkEventArgs argss)
{
BackgroundWorker b = o as BackgroundWorker;
Console.WriteLine("The value of i this time is {0}", i);
downloader.DoDownload(serviceidslist[i]);
});
bw.RunWorkerAsync();
}
只是一个想法,但是添加一个局部变量并将其分配给i
:
int temp = i;
然后使用它:
Console.WriteLine("The value of i this time is {0}", temp);
downloader.DoDownload(serviceidslist[temp]);
我认为问题可能是你的BackgroundWorker关闭了变量而不是值,因此需要每次在循环中存储它的副本。
也见此处
c#中的"闭包"是什么?(重复)问题在于变量i的使用。
试试这个:
for (int i = 0; i < serviceidslist.Count; i++)
{
var index = i;
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += new DoWorkEventHandler(
delegate(object o, DoWorkEventArgs argss)
{
BackgroundWorker b = o as BackgroundWorker;
Console.WriteLine("The value of i this time is {0}", index );
downloader.DoDownload(serviceidslist[index ]);
});
bw.RunWorkerAsync();
}`