【问题标题】:Wrong value of i while multithreading?多线程时 i 的值错误?
【发布时间】:2014-09-01 22:32:54
【问题描述】:

我正在尝试使用多线程来调用此函数。当我运行程序时,我得到一个异常“索引超出范围”。当我尝试打印 'i' 的值时,我每次都会得到 serviceids list.count。

在我的情况下,循环应该从 0 到 1 并打印 这次i的值为0 这次i的值为1

但它会打印两次

这次i的值为2 这次i的值为2

我的代码有什么问题,我该如何解决? DataDownloader 下载器 = new DataDownloader();

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

【问题讨论】:

  • 对我来说,在循环中构造 BackgroundWorker 实例看起来非常很奇怪。
  • 我想创建等于 serviceidlist.count 的线程数
  • 有些时候BackgroundWorker 是工作的正确工具 - 在其他时候则不是。就是这种情况……

标签: c# multithreading backgroundworker


【解决方案1】:

问题在于变量 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();
}`

【讨论】:

    【解决方案2】:

    只是一个想法,但是添加一个局部变量并将其分配给i

    int temp = i;

    然后使用它:

    Console.WriteLine("The value of i this time is {0}", temp);
    downloader.DoDownload(serviceidslist[temp]);
    

    我认为问题可能是您的 BackgroundWorker 正在关闭变量而不是值,因此每次都需要在循环中存储它的副本。

    请看这里

    What are 'closures' in C#? [duplicate]

    【讨论】:

    • 别担心,尽可能标记为答案,谢谢!
    猜你喜欢
    • 2022-08-21
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    相关资源
    最近更新 更多