Если вы используете Babel , то поддержка unicode уже доступна.
Я также выпустил плагин, который преобразует ваш исходный код, чтобы вы могли пишите регулярные выражения типа /^\p{L}+$/
. Затем они преобразуются во что-то, что понимают браузеры.
Вот страница проекта плагина: https://github.com/danielberndt/babel-plugin-utf-8-regex
То, что мы сделали, должно было записать небольшой слой вокруг портов завершения ввода-вывода, ReadFile и состояния GetQueuedCompletion в C++ / CLI, и затем перезвонить в C# когда завершенная операция. Мы предпочли этот маршрут BeginRead, и c# асинхронный операционный шаблон для обеспечения большего количества управления буферами раньше читал из файла (или сокет). Это было довольно большим увеличением производительности по чисто управляемому подходу, который выделяет новый байт [] на "куче" с каждым чтением.
Плюс, существует намного больше полных примеров C++ использования портов IO Completion в межсетях
Я не уверен, что вижу, почему опция 1 не работала бы на Вас. Следует иметь в виду, что у Вас не может быть двух различных потоков, пытающихся использовать тот же FileStream одновременно - выполнение так определенно вызовет Вас проблемы. BeginRead/EndRead предназначен, чтобы позволить Вашему коду продолжить выполняться, в то время как потенциально дорогая операция IO занимает места, для не включения своего рода многопоточного доступа к файлу.
Таким образом, я предложил бы, чтобы Вы искали и затем сделали beginread.
Что, если Вы загрузили ресурс (данные файла или безотносительно) в память сначала и затем совместно использовали его через потоки? Так как это - маленький дб. - Вы не будете иметь как много проблем для контакта с.
Используйте подход № 1, но
Когда запрос войдет, возьмите блокировку A. Используйте его для защиты очереди незаконченных запросов чтения. Добавьте его к очереди и возвратите некоторый новый асинхронный результат. Если это приводит к первому дополнению к очереди, назовите шаг 2 перед возвратом. Блокировка выпуска перед возвратом.
Когда чтение завершится (или названный шагом 1), возьмите блокировку A. Используйте его для защиты сования запроса чтения от очереди. Возьмите блокировку B. Используйте его для защиты Seek
-> BeginRead
-> EndRead
последовательность. Блокировка выпуска B. Обновите асинхронный результат, созданный шагом 1 для этой операции чтения. (Так как завершенная операция чтения, назовите это снова.)
Это решает проблему не блокирования любого потока, который начинает чтение просто, потому что другое чтение происходит, но все еще упорядочивает чтения так, чтобы текущая позиция потока файла не становилась испорченной.