Во-первых, хотя .NET довольно неплох с точки зрения производительности, но если базовое требование - очень высокая производительность, я бы обратился к неуправляемому языку, скомпилированному на собственном языке, например C ++. JIT-компиляция и другие издержки CLR замедляют работу любого алгоритма, написанного на .NET.
Я думаю, что тысячи действительно одновременных запросов будут указывать на сильно распределенную модель; Прямо сейчас лучшее серверное оборудование на рынке (двухъядерные процессоры Xeon с двумя ядрами и гиперпоточностью) будет выполнять только 32 вещи одновременно, и прослушивание запросов на выполнение каких-либо задач, общение на аппаратном уровне и другие общие операционные / временные издержки потребуют до нескольких из них. Я бы проанализировал реальный трафик, который вы ожидаете обрабатывать этим сервером одновременно, и измерил бы количество ящиков, над которыми вы работаете, для соответствия.
Во-вторых, я думаю, что вы говорите, когда говорите, что «потоки завершения ввода-вывода» - это потоки, которые асинхронные вызовы Begin / End используют для своей работы, а не потоки из ThreadPool (избегайте в действительности потока - тяжелые приложения) или созданные пользователем темы (никаких проблем с ними, просто следите за количеством потоков). На самом деле, за исключением нескольких особых случаев, поток является потоком, и именно то, где он порождается, не имеет большого значения на аппаратном уровне, поэтому, если вы действительно этого хотите, порождение рабочих потоков, использующих синхронные вызовы, даст вам довольно почти тот же результат (но, как правило, лучше использовать инструменты, которые у вас есть, чем создавать новые).
Теперь к вашему настоящему вопросу. Нет, не существует асинхронной модели для хеширования; если вы хотите многопоточность операции хеширования, поток должен порождаться отдельно. Однако для хеширования требуется потоковый или байтовый буфер, который можно получить асинхронно с помощью Stream.BeginRead (), а метод обратного вызова, переданный в BeginRead (), может выполнить хеширование в потоке, порожденном асинхронным вызовом.