В настоящее время я профилирую свое приложение с помощью шкалы времени dotTrace. Я обнаружил, что в G C тратится много времени, что ожидается, но не ожидается, что я вижу, как много пользовательских потоков приостанавливаются во время сбора фона.
скриншоты профилировщика:
Из рисунка видно, что у меня два потока выполняют некоторую работу с процессором, затем возникает «фон» G C и первый поток приостанавливается чуть позже и вторая немедленно отстранена.
Вы можете видеть, что пользовательские потоки действительно заблокированы потоком сборщика мусора.
Я знаю, что может быть передний план, блокирующий G C Gen 0 и Gen 1 во время фона G C. Но это не тот случай, поскольку все G C относятся к Gen 2.
Я создал базовое c решение для воспроизведения на github: https://github.com/isaevdan/BackgroundGCSuspendsThreads