C# While循环或For循环不退出

C# While循环或For循环不退出,c#,while-loop,C#,While Loop,我正在尝试创建一个线程并将其添加到线程列表中: int j = 0; while(j!=6) { Thread th = new Thread(() => SaveImages(L104List[j], folderFilePath, bw)); ThreadList.Add(th); j++; //th.Start(); } 但当j变为6时,它不会退出。因此它抛出了一个s异常: 附加信息:索引超出范围。必

我正在尝试创建一个线程并将其添加到线程列表中:

int j = 0;
while(j!=6)
    {
        Thread th = new Thread(() => SaveImages(L104List[j], folderFilePath, bw));
        ThreadList.Add(th);
        j++;
        //th.Start();
     }
但当j变为6时,它不会退出。因此它抛出了一个s异常:

附加信息:索引超出范围。必须为非负数且小于集合的大小

但是,每当我尝试使用断点手动迭代循环时,它就会退出并转到下一个代码语句。它为什么这样做

另外,我还尝试了for循环,它也做到了。

  • 首先,您的闭包将出现捕获问题

  • 您的
    while
    循环似乎是
    for
    foreach
    循环的完美案例

  • 我还不确定您是否需要为此使用
    线程
    类,或者如果您这样做,它将是最佳的。为什么不改用
    任务

  • 更进一步,为什么不让第三方物流为您做艰苦的工作

简单并行示例

Parallel.ForEach(L104List, (item) => SaveImages(item, folderFilePath, bw));
优点是

  • 您不会遇到关闭循环变量的问题
  • 当CPU过载时,您不必担心线程切换效率低下
  • 任务调度器将从线程池中分割线程,其方式很可能比运行数组中所包含的线程数更有效
  • 它会一直等到你所有的工作完成
  • 这是一行代码,更容易理解
另外,如果您可以使您的方法异步,您可能会获得更高的效率


执行foreach(对于Visual Basic中的每个)操作,其中 迭代可以并行运行

  • 首先,您的闭包将出现捕获问题

  • 您的
    while
    循环似乎是
    for
    foreach
    循环的完美案例

  • 我还不确定您是否需要为此使用
    线程
    类,或者如果您这样做,它将是最佳的。为什么不改用
    任务

  • 更进一步,为什么不让第三方物流为您做艰苦的工作

简单并行示例

Parallel.ForEach(L104List, (item) => SaveImages(item, folderFilePath, bw));
优点是

  • 您不会遇到关闭循环变量的问题
  • 当CPU过载时,您不必担心线程切换效率低下
  • 任务调度器将从线程池中分割线程,其方式很可能比运行数组中所包含的线程数更有效
  • 它会一直等到你所有的工作完成
  • 这是一行代码,更容易理解
另外,如果您可以使您的方法异步,您可能会获得更高的效率


执行foreach(对于Visual Basic中的每个)操作,其中 迭代可以并行运行


我会这样做:

foreach(var data in L104List)
{
   string local = data;
   ThreadStart work = delegate { SaveImages(local, folderFilePath, bw); };
   new Thread(work).Start();
}

我会这样做:

foreach(var data in L104List)
{
   string local = data;
   ThreadStart work = delegate { SaveImages(local, folderFilePath, bw); };
   new Thread(work).Start();
}

我猜
L104List
可能少于集合中的6项。@D-Shih它的计数为6,因此如果j给出6,它抛出和异常,因为数组中的第6个数字是5,对吗?为什么不使用
L104List.Lenght>j
作为条件?我猜
L104List
可能在集合中少于6项。@D-Shih它的计数是6,所以如果j给出6,它抛出和异常,因为数组中的第6个数字是5,对吗?为什么不使用
L104List.Lenght>j
作为条件?@TerribleDog如果没有,则在执行
并行后,一切都将完成。ForEach
@TerribleDog如果没有,执行
Parallel.ForEach