Não se enganem muito pelo exemplo. Neste artigo, o autor usa Task
e Thread
no mesmo lugar, e não são a mesma coisa, por mais que comportamentos parecidos. Um possui um pool gerenciado pelo Runtime, mais eficiente para operações assíncronas e tarefas no mesmo contexto, o outro é gerenciado pelo sistema operacional, onde o contexto varia um pouco mais e a conversação entre threads tem que ser feita com cuidado.
Parallel.For
tem poucos usos se souber usar bem. Se entender a fundo, entenderá que tarefas assíncronas não podem travar objetos com synclock, no caso é usado semáforos, mas reduzindo a performance geral.
Colocar lock (objeto)
em outro Thread nem sempre é a melhor resolução para seu problema. O .NET oferece o ConcurrentBag<T>
, ConcurrentStack
, ConcurrentSeiLáOque
para quase tudo o que você precisa, implementações prontas para serem usadas por mais de um thread.
Recomendo ler as diferenças entre Task e Threads, pode ajudar a entender o que quero dizer.