【问题标题】:Using ThreadPool for processing files使用 ThreadPool 处理文件
【发布时间】:2015-11-21 02:22:17
【问题描述】:

目前我们有一个服务器,其中文件以每天大约 10,000 个文件(每小时 500 个)的速度保存。

我的程序已经成功地解析了这些文件并将相关信息放入数据库中。问题是,我的单线程应用程序远远无法跟上步伐,真的落后了。

我想尝试创建一个包含 3-5 个线程的线程池,看看是否有助于跟上。

应用程序查看文件夹并获取所有文件名,如下所示:

      For Each newfile As String In Directory.GetFiles(fileLoc)
      Next

我想做的是根据线程是否处于活动状态,将每个文件分配给线程池中的一个线程,如下所示:

          For Each newfile As String In Directory.GetFiles(fileLoc)
                   If Not (Thread1.IsAlive) Then
                        Thread1 = New Threading.Thread(Sub() dowork(arg1, arg2))
                   ElseIf Not (Thread2.IsAlive) Then
                        Thread2 = New Threading.Thread(Sub() dowork(arg1, arg2))
                   ElseIf Not (Thread3.IsAlive) Then
                        Thread3 = New Threading.Thread(Sub() dowork(arg1, arg2))
                   End If
            Next

我在浏览论坛时遇到了一个使用

的教程
 System.Threading.ThreadPool.QueueUserWorkItem(Sub() dowork(arg1, arg2))

不确定这是否是我正在寻找的,但我没有看到设置池中活动线程数的方法 (3-5)。

所以我的问题是 - 如何浏览文件列表,并将文件分配给打开/可用线程?

非常感谢您的任何帮助,谢谢-Z

编辑

    For Each newfile As String In Directory.GetFiles(fileLoc).AsParallel.WithDegreeOfParallelism(10)
        theWorker(newfile)
    Next

【问题讨论】:

标签: .net vb.net multithreading visual-studio threadpool


【解决方案1】:

您不需要自己管理任何池。

Directory.GetFiles(fileLoc)
.AsParallel().WithMaxDOP(3)
.ForEach(path => dowork(path, arg2));

就是这样。通过实验确定最佳并行度。

【讨论】:

  • .ForEach 似乎不是一个选项?也感谢您的帮助,这个解决方案看起来非常简单
  • 我的意思是ForAll。这与foreach 不同。这是一种 PLINQ 方法。我总是混淆这些名字。
  • 你能看看上面的编辑并告诉我它是否做同样的事情吗?
  • 这是每个循环的序列号。那不是平行的。
  • Directory.GetFiles(fileLoc).AsParallel.WithDegreeOfParallelism(4).ForAll(Sub() theWorker()) .... 所以在这个例子中,我将如何填写“thisfilename " 与每个的名称?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
  • 2019-01-07
  • 2020-09-10
  • 2022-10-18
  • 2020-09-17
  • 1970-01-01
相关资源
最近更新 更多