Лучший способ выполнить тяжелую функцию, которая может заморозить программу?
У меня есть тяжелая функция, которая использует много регулярных выражений, чтобы сопоставить большой тест с расширенным текстовым полем.
Каждый раз, когда этот текст изменяется ( OnTextChangedEvent), вызывается эта функция. Эта функция, если я пишу быстро, на некоторое время парализует всю программу.
Я думал о каком-то решении, таком как:
- Задержка на мероприятии изменилась
- Нить
- Запустите эту функцию на холостом ходу.
Который лучший? И как я могу применить это к моей функции?
3 ответа
Такая функция не должна вызываться из OnTextChanged. Заставьте его работать в фоновом потоке, обновите результаты после его завершения. Подумайте о том, как работает Intellisense - он запускается при любых изменениях кода, но обновляет экран только при получении ответов.
Я согласен с ответом Лорен, но вот еще немного информации / вариантов.
Во-первых, тяжелый reg ex должен быть запущен в другом потоке, а не в том, что у вас с графическим интерфейсом. На ваше OnTextChanged
установите глобальный грязный бит и временную метку (например,:dirty @ 20:00).
Ваш фоновый поток может поднять это и счастливо работать в фоновом режиме, пока не завершится и не обновит графический интерфейс. Как только это сделано, он может проверить, есть ли какие-нибудь грязные биты, которые появились после его запуска или с момента последнего завершения.
Еще лучшим подходом может быть отмена выполняемого вычисления, если изменения делают недействительным то, что он делает, но вы не предоставили достаточно данных для этого.
Вы спрашиваете мнение. Я считаю, что эту проблему лучше всего решить, запустив ее в отдельном потоке.
В прошлом мы бы делали это на холостом ходу, но на самом деле в этом нет никакого преимущества и немало боли. Цикл бездействия все еще является разумным способом делать вещи, которые должны постоянно обновлять пользовательский интерфейс, но в остальном не стоит хлопот.
Тебе другое предложение ни к чему не приведет.
Но это только мое мнение.