ワーカーをキューに追加したいのですが、最初の N 個のワーカーのみを並列処理します。私が見つけたすべてのサンプルは C# にあります。
これはおそらくプログラマーにとっては簡単なことですが、私はそうではありません。VB については、簡単なプログラムを作成するのに十分な知識があります。
しかし、私の最初のアプリケーションは、突然 100% の CPU に達してクラッシュするまでは正常に動作します。助けてください (はい、これを投稿する前に検索に 5 時間も費やしました...)
詳細コンテキスト: 100 万を超えるディレクトリ/サブディレクトリを持つファイル サーバー全体で、ディレクトリ構造、ファイル、およびアクセス許可の再帰的なインベントリを実行します。
プロセスは順次実行されますが、完了するまでに数か月かかります。経営陣はすでに私の首を呼吸しています。タスクを使用しようとすると、スレッド数が約 1000 になり、CPU 使用率が 100% になり、応答が停止してクラッシュします。これは、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