多任务c#|使数组索引越界

多任务c#|使数组索引越界,c#,task,indexoutofboundsexception,C#,Task,Indexoutofboundsexception,我正在写一个方法,可以从LAN共享目录和FTP共享目录下载文件。我有多个供应商的名单。我正在使用任务来实现这一点。但我正在从Bond异常中获得ArrayIndex。虽然我的循环条件是正确的 下面是代码段 vendorWiseTasksListening = new List<Task>(); for (int i = 0; i < allVendorIDs.Length; i++) {

我正在写一个方法,可以从LAN共享目录和FTP共享目录下载文件。我有多个供应商的名单。我正在使用任务来实现这一点。但我正在从Bond异常中获得ArrayIndex。虽然我的循环条件是正确的

下面是代码段

 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());
vendorWiseTasksListening=新列表();
for(int i=0;iFTPMode(allVendorIDs[i]);
vendorWiseTasksListening.Add(任务);
task.Start();
任务=新任务(()=>SharedMode(AllVendorId[i]);
vendorWiseTasksListening.Add(任务);
task.Start();
}
Task.WaitAll(vendorWiseTasksListening.ToArray());

任何帮助都将不胜感激。

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

如果某个任务在主线程中的循环完成后访问
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();
                }
for(int i=0;iFTPMode(allVendorIDs[j]);
vendorWiseTasksListening.Add(任务);
task.Start();
任务=新任务(()=>SharedMode(AllVendorId[j]);
vendorWiseTasksListening.Add(任务);
task.Start();
}

例如,请参阅。

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

如果某个任务在主线程中的循环完成后访问
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();
                }
for(int i=0;iFTPMode(allVendorIDs[j]);
vendorWiseTasksListening.Add(任务);
task.Start();
任务=新任务(()=>SharedMode(AllVendorId[j]);
vendorWiseTasksListening.Add(任务);
task.Start();
}

例如,请参阅。

除非您的共享对象变得足够智能,可以实现线程安全。。。它们不是线程安全的,这意味着从多个线程访问它们时会出现错误。那么我如何确保它们是线程安全的呢?某种类型的锁定。以一种不需要共享对象的方式编程,并在最后执行集合。锁定是最简单的(读取lock关键字)。最后:你要求我们教你编程。太宽了。了解线程安全性。好吧,除非你的共享对象变得足够聪明,可以保证线程安全。。。它们不是线程安全的,这意味着从多个线程访问它们时会出现错误。那么我如何确保它们是线程安全的呢?某种类型的锁定。以一种不需要共享对象的方式编程,并在最后执行集合。锁定是最简单的(读取lock关键字)。最后:你要求我们教你编程。太宽了。了解线程安全性。