Ich habe diese Anwendung, die alle Ordner in einem bestimmten Verzeichnis recurse und nach PDF suchen. Wenn eine PDF-Datei gefunden wird, zählt die Anwendung ihre Seiten mit ITextSharp. Ich tat dies, indem ich einen Thread benutzte, um alle Ordner für pdf rekursiv zu scannen, und wenn dann PDF gefunden wird, wird es in den Thread-Pool eingereiht. Der Code sieht wie folgt aus:Wie kann man wissen, ob der gesamte Thread-Pool-Thread bereits mit seinen Aufgaben erledigt ist?
//spawn a thread to handle the processing of pdf on each folder.
var th = new Thread(() =>
{
pdfDirectories = Directory.GetDirectories(pdfPath);
processDir(pdfDirectories);
});
th.Start();
private void processDir(string[] dirs)
{
foreach (var dir in dirs)
{
pdfFiles = Directory.GetFiles(dir, "*.pdf");
processFiles(pdfFiles);
string[] newdir = Directory.GetDirectories(dir);
processDir(newdir);
}
}
private void processFiles(string[] files)
{
foreach (var pdf in files)
{
ThreadPoolHelper.QueueUserWorkItem(
new { path = pdf },
(data) => { processPDF(data.path); }
);
}
}
Mein Problem ist, wie kann ich wissen, dass der Thread des Thread-Pool hat alle Warteschlange Elemente beendet die Verarbeitung, so dass ich den Benutzer sagen kann, dass die Anwendung mit ihrer beabsichtigten Aufgabe erledigt ist?
Ich habe eine ähnliche Logik zu diesem Thema gemacht. Nur ich habe die ThreadPool.GetAvailableThreads verwendet. Ich setzte die MaxThreads, die die Pools verwenden sollten, mit 20. Also habe ich bei der letzten Aufgabe überprüft, ob die verfügbaren Threads gleich dem Max sind, den ich gesetzt habe. Leider schlägt das fehl. Ich werde über das Manual Reset Event nachforschen. –
@mcxiand: Sie können die ThreadPool-Leistungsindikatoren nicht verwenden, da anderer Code (lib) Threads erstellen könnte und der TP sie recycelt/löscht. –
@Henk Holterman: Ist das so? Von dem, was ich verstanden habe, ist der ThreadPool Task von QueueUserWorkItem-Methode in die Warteschlange gestellt. Kannst du mehr Details zu deinem Kommentar angeben? es würde sehr geschätzt werden. –