Вы, кажется, путаете «написание многопоточных приложений» с «превращением каждого класса в поточно-ориентированный». Оставляя в стороне сложный вопрос определения термина «безопасность потоков» Я бы предложил, чтобы очень немногие из ваших классов использовали блокировку в большинстве приложений.
Обычно я пишу много классов, которые не пытаются явно поточно-ориентированными, но в то же время не имеют никаких потоковых зависимостей. Они предполагают, что если вы собираетесь использовать их из нескольких потоков, вы будете делать это только из одного потока за раз, с соответствующими барьерами памяти, чтобы убедиться, что изменения, сделанные в одном потоке, видны в любом потоке, который их использует в следующем.
Тогда существует относительно несколько классов, которые выполняют необходимую координацию.
Теперь, возможно, проблемы с Code Contracts сделают эти несколько классов достаточно слабыми, чтобы заставить всю мысль рухнуть ... но я бы не предполагал, что для начала.
Я несколько более осторожен в вопросах, с которыми Code Contracts столкнется с тем, что компилятор C # выполняет все больше и больше работы по переписыванию вашего кода ... Я не знаю, занималась ли команда Contracts проблемами блоков итераторов, но даже если у них есть, им придется делать это снова, когда C # 5 выходит с асинхронными методами ...