Любая операция блокировки является потенциальной тупиковой ситуацией. Есть способы, которыми вы можете минимизировать или практически исключить вероятность возникновения тупика (если вы всегда будете следить за тем, чтобы ваши синхронизированные операции заканчивались за определенное время), но в общем случае вы не можете просто предполагать, что есть безопасный способ предотвратить тупики.
Тайм-аут имеет большое значение для обеспечения того, чтобы ваше приложение не зашло в тупик, но тогда у вас будет остановка, и вам нужно будет восстановиться после тайм-аута исключительным образом. Тот же поток программы больше не применяется.
Если у вас есть потоки, которые генерируют исключения, проверьте окно «Отладка> Вывод» в Visual Studio, и кажется, что оно всегда перехватывает исключение, даже если отладчик не прерывается при работе с несколькими потоками.
Похоже, вы разделяете работу на отдельные потоки для достижения параллелизма. Зачем вам это нужно в приложении ASP.NET?