多线程时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的值错误

只是一个想法,但是添加一个局部变量并将其分配给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();
}`