【发布时间】:2016-05-06 22:41:22
【问题描述】:
我想将工作人员添加到队列中,但只有前 N 个工作人员并行处理。我找到的所有示例都在 C# 中。
这对程序员来说可能很简单,但我不是。我对 VB 的了解足以编写简单的程序。
但是我的第一个应用程序运行良好,直到它突然达到 100% CPU 然后崩溃。请帮忙(是的,我已经浪费了 5 个小时的工作时间搜索才发布此内容......)
更多上下文:对具有超过 100 万个目录/子目录的文件服务器执行目录结构、文件和权限的递归清单。
流程连续运行,但需要数月才能完成。管理层已经在我的脖子上呼吸了。当我尝试使用 Tasks 时,它会进入大约 1000 个线程,然后达到 100% CPU,停止响应,然后崩溃。这是在具有 112 GB RAM 的 16 核服务器上。
--添加 因此,通过使用信号量提供的示例,这就是我放入的内容:
Public Class InvDir
Private mSm as Semaphore
Public Sub New(ByVal maxPrc As Integer)
mSm = New Semaphore(maxPrc, maxPrc)
End Sub
Public Sub GetInventory(ByVal Path As String, ByRef Totals As Object, ByRef MyData As Object)
mSm.WaitOne()
Task.Factory.StartNew(Sub()
Dim CurDir As New IO.DirectoryInfo(Path)
Totals.SubDirectoryCount += CurDir.GetDirectories().Count
Totals.FilesCount += CurDir.GetFiles().Count
For Each CurFile As IO.FileInfo in CurDir.EnumerateFiles()
MyData.AddFile(CurFile.FileName, CurFile.Extension, CurFile.FullName, CurFile.Length)
Next
End Sub).ContinueWith(Function(x) mSm.Release())
End Sub
End Class
【问题讨论】:
-
告诉“管理层”聘请顾问。
-
您的问题范围太广,我们无法解释为什么我们看不到的代码行为不正常。我们不会为您编写任务调度程序,也不是可以教您这样做的教程网站。如果您对 VB 有足够的了解以编写简单的程序,那么您的要求超出了您当前的技能,您需要告诉管理层您需要帮助,以便他们可以聘请承包商或程序员。
-
我不是要别人写一个“任务调度器”。 .NET 中有一个 TaskScheduler OBJECT,我找到的关于如何使用它的所有示例代码都在 C# 中。我只是问如何在 VB.NET 中做到这一点。我把我正在做的事情放在上下文中,而不是要求有人为我做我的工作。我尝试过使用 Task 对象的 Collection 和 Parallel.ForEach 方法,但它们很快就会占用所有线程。
-
我建议将您现有的代码添加到您的问题中。在 cmets 中几乎不可读。
-
您已经尝试过 Tasks 和 Parallel.ForEach,您正在编写递归函数,并且正如您所提到的,您只是在寻找提供输入的人,而不是为您完成工作。谁告诉你你不是程序员?
标签: vb.net multithreading task taskscheduler