Mam długotrwały proces, który odczytuje duże pliki i zapisuje pliki podsumowań. Aby przyspieszyć, jestem przetwarzanie wielu plików jednocześnie stosując regularne stare wątki:Wątki kontra procesy w .NET
ThreadStart ts = new ThreadStart(Work);
Thread t = new Thread(ts);
t.Start();
Co odkryłem, że nawet z oddzielnych wątków czytania pojedynczych plików i brak blokady między nimi i za pomocą 4 wątki na 24 -pokrywarka, nie mogę nawet uzyskać do 10% na procesorze lub 10% na dysku I/O. Jeśli używam więcej wątków w mojej aplikacji, wydaje mi się, że działa ona jeszcze wolniej.
Przypuszczam, że robię coś złego, ale gdy robi się ciekawy, to jeśli uruchomię cały exe drugi i trzeci raz, to faktycznie przetwarza pliki dwa i trzy razy szybciej. Moje pytanie brzmi: dlaczego nie mogę uzyskać 12 wątków w mojej aplikacji do przetwarzania danych i opodatkowania urządzenia, a także 4 wątków w 3 przypadkach mojej aplikacji?
Profilowałem aplikację, a najbardziej czasochłonne i często nazywane funkcje są wywołaniami ciągów.
Nie można powiedzieć bez rzeczywistego kodu wykonującego przetwarzanie pliku. –
Co uruchomił profil, mówiąc o tym, gdzie jest wąskie gardło? –
Powinieneś mieć kilka wspólnych miejsc (do których dostęp mają wątki przetwarzania) z kodem blokującym/synchronizującym, czy mógłbyś udostępnić ten kod synchronizacji – sll