多任务c#|使数组索引越界
我正在写一个方法,可以从LAN共享目录和FTP共享目录下载文件。我有多个供应商的名单。我正在使用任务来实现这一点。但我正在从Bond异常中获得ArrayIndex。虽然我的循环条件是正确的 下面是代码段多任务c#|使数组索引越界,c#,task,indexoutofboundsexception,C#,Task,Indexoutofboundsexception,我正在写一个方法,可以从LAN共享目录和FTP共享目录下载文件。我有多个供应商的名单。我正在使用任务来实现这一点。但我正在从Bond异常中获得ArrayIndex。虽然我的循环条件是正确的 下面是代码段 vendorWiseTasksListening = new List<Task>(); for (int i = 0; i < allVendorIDs.Length; i++) {
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关键字)。最后:你要求我们教你编程。太宽了。了解线程安全性。