【问题标题】:Multitasking c#| Getting Array index out of bound多任务 c#|使数组索引越界
【发布时间】:2016-04-11 06:43:00
【问题描述】:

我正在编写一个从 LAN 共享目录和 FTP 共享目录下载文件的方法。我有多个供应商的列表。我正在使用任务来实现这一点。但我得到 ArrayIndexOutofBond 异常。虽然我的循环条件是对的?

这里是代码段。

 vendorWiseTasksListening = new List<Task>();
                    for (int i = 0; i < allVendorIDs.Length; i++)
                    {
                        Task task = new Task(() => FTPMode(allVendorIDs[i]));
                        vendorWiseTasksListening.Add(task);
                        task.Start();
                        task = new Task(() => SharedMode(allVendorIDs[i]));
                        vendorWiseTasksListening.Add(task);
                        task.Start();
                    }
                    Task.WaitAll(vendorWiseTasksListening.ToArray());

任何帮助将不胜感激。

【问题讨论】:

  • 好吧,除非你的共享对象足够聪明以保证线程安全......它们不是线程安全的,这意味着你从多个线程访问它们时会出错。
  • 那么我怎样才能确保它们成为线程安全的呢?
  • 锁定了一些排序。以不需要共享对象并在最后进行收集的方式进行编程。 LOCKING 是最简单的(阅读 lock 关键字)。最后:你要求我们教你编程。太宽泛了。

标签: c# task indexoutofboundsexception


【解决方案1】:

您的问题可能是,您的变量 i 的值在您创建新任务后不会保存,但您的所有任务都使用对同一变量 i 的引用。而这个i 会递增到allVendorIDs.Length

如果某个Task在主线程循环结束后访问i的值,就会得到allVendorIDs.Length

制作i 的本地副本并在您的任务中使用它:

 for (int i = 0; i < allVendorIDs.Length; i++)
                {
                    int j = i;
                    Task task = new Task(() => FTPMode(allVendorIDs[j]));
                    vendorWiseTasksListening.Add(task);

                    task.Start();
                    task = new Task(() => SharedMode(allVendorIDs[j]));
                    vendorWiseTasksListening.Add(task);
                    task.Start();
                }

参见例如this question for a simpler example and explanation

【讨论】:

    猜你喜欢
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多