Una aplicación puede tener un performance o rendimiento que no sean los óptimos por muchos motivos, pero uno de ellos puede ser el hecho de no trabajar bien con procesos que podrían paralelizarse y no se paralelizan.
En caso de paralelizar procesos además hay que tener en cuenta que tu aplicación va a trabajar con diferentes hilos, y que no todos los elementos de C# son seguros al ser manejados por diferentes hilos paralelos.
A continuación presento por qué usar ConcurrentBag, un elemento que implementa IEnumerable como pueda ser List, y que deberá sustituir a List si las vas a necesitar en un proceso con hilos paralelos que tienen subprocesos.