Você não pode garantir no .net que dois Threads sejam executados em dois núcleos separados. De fato, você também não pode garantir que um Threadseja executado em apenas um núcleo (!) .
Isso ocorre porque os threads gerenciados não são iguais aos threads do SO - um único Thread gerenciado pode usar vários threads do SO para suportá-lo. Em C #, você só lida diretamente diretamente com Threads gerenciados (pelo menos, sem recorrer a p / invoke para chamar as funções de threading do WinAPI, o que você nunca deve fazer) .
No entanto, os agendadores de threads .Net e Windows são muito bons no que fazem - eles não executariam dois threads em um único núcleo enquanto um segundo núcleo fica completamente inativo. Portanto, em geral, você não precisa se preocupar com isso.
t1et2for executado em momentos diferentes em uma ordem arbitrária (por exemplo, é possívelt2iniciar antest1em alguns modelos).