Ich verwende C# 3.5 und die reaktive Erweiterung, die TPL in C# Version vor 4 unterstützt.
Meine Anwendung ruft GC.Collect() an mehreren Stellen auf (ja, ich weiß, dass ich diese Methode nicht manuell aufrufen sollte, aber bitte lassen Sie diesen Punkt zumindest für diese Frage in Ruhe). Bevor ich die Multithreading-Implementierung eingebaut habe, hat es gut funktioniert. GC.Collect() wird in jedem der Threads aufgerufen, so dass es in einem Multithreading-Kontext aufgerufen wird.
Dann verwende ich den Task, um Multithreading zu implementieren, und ich habe festgestellt, dass die Threads nicht mehr richtig funktionieren, wenn die Anwendung eine Weile läuft und der Speicherverbrauch steigt. Ich erkläre "die Threads nicht mehr richtig funktionieren" aus dem Szenario, dass die CPU-Nutzung auf einem Multi-Core-Computer fällt auf Single-Thread-Ebene, anstatt voll ausgelastet.
Als ich versucht habe, dieses Problem zu lösen, habe ich lediglich den Aufruf GC.Collect() auskommentiert, und diese Änderung bewirkt, dass die Threads gut funktionieren. Ich möchte GC.Collect() ausschalten, es sei denn, wenn ich etwas Großes in meiner Anwendung ausführe, werde ich ohne GC.Collect() in eine OutOfMemory-Ausnahme laufen. Das ist der Grund, warum ich den Aufruf beibehalte.
Könnte mir jetzt jemand erklären, warum GC.Collect() in einem Multithreading-Kontext auf einem Rechner mit viel Speicher ein Multithreading-Problem verursacht? Gibt es eine verwandte Theorie zu diesem Bit? Vielen Dank für die Antwort.