Если миллион файлов находится на одном физическом устройстве, то многопоточность тут не требуется и даже вредна. Для поиска на нескольких дисках достаточно запустить просто несколько экземпляров приложения для поиска, указав для каждого свой список файлов на своих дисках.
Последовательное чтение файлов для простого поиска подстроки - очень простая задача, берешь c++, делаешь цикл с fgetstr (если обработка нужна построчная), заранее подготавливаешь искомые строки во всех используемых кодировках как набор байт char* (в идеале в виде констант, т.е. сгенерировав код) просто сравнивая их с помощью strcmp... если таких строк много то подготовь таблицы посимвольного поиска (нагенерировать последовательно вложенные switch case) - этот подход наиболее быстрый из всех возможных, позволяет обрабатывать миллионы строк в секунду
p.s. если что, gui можно реализовать на одном языке программирования (c# .net) а поиск на c++, запуская из gui приложение, передав нужные параметры в командной строке или специальном файле
p.p.s. если поиск нужно делать часто, может все же поместить эти файлы в базу данных и создать для искомых данных индексы?