Лучший способ выполнить тяжелую функцию, которая может заморозить программу?

У меня есть тяжелая функция, которая использует много регулярных выражений, чтобы сопоставить большой тест с расширенным текстовым полем.

Каждый раз, когда этот текст изменяется ( OnTextChangedEvent), вызывается эта функция. Эта функция, если я пишу быстро, на некоторое время парализует всю программу.

Я думал о каком-то решении, таком как:

  • Задержка на мероприятии изменилась
  • Нить
  • Запустите эту функцию на холостом ходу.

Который лучший? И как я могу применить это к моей функции?

3 ответа

Такая функция не должна вызываться из OnTextChanged. Заставьте его работать в фоновом потоке, обновите результаты после его завершения. Подумайте о том, как работает Intellisense - он запускается при любых изменениях кода, но обновляет экран только при получении ответов.

Я согласен с ответом Лорен, но вот еще немного информации / вариантов.

Во-первых, тяжелый reg ex должен быть запущен в другом потоке, а не в том, что у вас с графическим интерфейсом. На ваше OnTextChangedустановите глобальный грязный бит и временную метку (например,:dirty @ 20:00).

Ваш фоновый поток может поднять это и счастливо работать в фоновом режиме, пока не завершится и не обновит графический интерфейс. Как только это сделано, он может проверить, есть ли какие-нибудь грязные биты, которые появились после его запуска или с момента последнего завершения.

Еще лучшим подходом может быть отмена выполняемого вычисления, если изменения делают недействительным то, что он делает, но вы не предоставили достаточно данных для этого.

Вы спрашиваете мнение. Я считаю, что эту проблему лучше всего решить, запустив ее в отдельном потоке.

В прошлом мы бы делали это на холостом ходу, но на самом деле в этом нет никакого преимущества и немало боли. Цикл бездействия все еще является разумным способом делать вещи, которые должны постоянно обновлять пользовательский интерфейс, но в остальном не стоит хлопот.

Тебе другое предложение ни к чему не приведет.

Но это только мое мнение.

Другие вопросы по тегам