【问题标题】:read and process file using multithread使用多线程读取和处理文件
【发布时间】:2014-07-29 18:08:16
【问题描述】:

我正在阅读一个包含大约 200 个文件的文件夹。我认为是创建 4 个流以 4 到 1 1 循环读取文件。但是我不能通过数组错误控制。 这是示例:

FileInfo[] fileArray = _directoryInfo.GetFiles("*.txt");
for(int i = 0; i<fileArray.Length;i+=4)
{
    Thread t1 = new Thread(function(fileArray[i]));
    t1.Start();
    Thread t2 = new Thread(function(fileArray[i+1]));
    t2.Start();
    Thread t3 = new Thread(function(fileArray[i+2]));
    t3.Start();
    Thread t4 = new Thread(function(fileArray[i+3]));
    t4.Start();
}

但结果是在

收到的
IndexOutOfRangeException

我检查 fileArray 有 200 个文件 txt。 我需要一个解决方案...

【问题讨论】:

  • 除非您在每个循环结束时等待这 4 个线程,否则您将启动超过 4 个线程...
  • 那是你的实际代码吗?那是new Thread(function(fileArray[1+2])) 行是正是吗?或者它实际上是一个 lambda 函数,更像:new Thread(() =&gt; function(fileArray[1+2]))?如果是后者,这可能是由于一个关闭问题,您的 所有/大多数 线程正在使用 i 的最后一个值执行(200+,所以查找 fileArray[200], fileArray[201], fileArray[202], fileArray[203]

标签: c# multithreading for-loop


【解决方案1】:
for(int i = 0; i<fileArray.Length;i+=4)//Here is the problem

您检查i&lt;fileArray.Length,但您在循环内访问fileArray[i+3]

我不确定你为什么一次启动4 线程。您可以像这样简单地编写上面的代码:

for(int i = 0; i<fileArray.Length;i++)
{
    Thread t1 = new Thread(function(fileArray[i]));
    t1.Start();
}

另请注意,启动大量线程绝不是一个好主意,请记住,您的机器只能同时执行 N 数量的线程,其中 N 是内核数量。

【讨论】:

  • 我认为数组是正好 200 个项目(或任何可被 4 整除的项目)它会起作用。但我同意,总的来说这是一个问题。也许不是 问题,但绝对是其中之一。 (我认为另一个可能是 lambda 闭包问题)
猜你喜欢
  • 1970-01-01
  • 2015-12-21
  • 1970-01-01
  • 1970-01-01
  • 2019-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多