【问题标题】:While loop or For loop does not exitWhile 循环或 For 循环不退出
【发布时间】:2021-01-10 07:04:29
【问题描述】:

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

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循环,它也这样做了。

【问题讨论】:

  • 我猜L104List 可能少于集合中的 6 项。
  • @D-Shih 它的计数是 6,所以如果 j 给出 6,它会抛出异常,因为数组中的第 6 个是 5 对吗?
  • 为什么不使用L104List.Lenght > j 作为条件?

标签: c# while-loop


【解决方案1】:
  • 首先,您的闭包会有一个捕获问题。

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

  • 我还不能满足您需要为此使用Thread 类,或者如果您这样做将是最佳选择。为什么不改用Task

  • 更进一步,为什么不让 TPL 为你做艰苦的工作

简单的并行示例

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

优点是

  • 你不会有关闭循环变量的问题
  • 您不必担心 CPU 过载时线程切换效率低下
  • 任务调度程序将从线程池中分配线程,这种方式很可能比运行阵列所容纳的线程数更有效。
  • 它会等到你所有的工作完成
  • 一行代码,更容易理解

补充说明,如果你可以让你的方法异步,你可能会获得更高的效率。


Parallel.ForEach Method

执行一个 foreach(在 Visual Basic 中为 For Each)操作,其中 迭代可以并行运行。

【讨论】:

  • @TerribleDog 你别这样,Parallel.ForEach执行后一切都会结束
【解决方案2】:

我会这样做:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 2015-08-15
    • 2016-02-27
    • 2021-07-27
    • 2022-01-26
    • 2013-03-01
    相关资源
    最近更新 更多