Перерисовка окна приложения

У меня есть программное обеспечение на C#, которое я пишу, и каждый раз, когда оно выполняет трудную задачу, я переключаю окна, чтобы позволить ему завершить работу винта. Не знаю, как это сказать, но все кнопки исчезают или становятся "дырами" . Я знаю, что приложение работает, потому что индикатор состояния снова появляется через некоторое время. Как это исправить? Я искал, и я уверен, что это как-то связано с doubleBuffering.

Отрезанное окно

2 ответа

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

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

немного более дешевый метод, который работает, но может время от времени иметь некоторые проблемы, состоит в том, чтобы включить в вашу длительную операцию вызов Application.DoEvents() время от времени, например, если вы находитесь в цикле, каждые несколько итераций цикла (зависит от того, сколько времени требуется для выполнения одной итерации и сколько всего у вас итераций); Этот метод работает и полностью спасает вас от начала работы с несколькими потоками, но также считается менее надежным.

Как уже отмечал LarsTech, используйте BackgroundWorker-Класс, особенно для задач, которые занимают больше, чем несколько секунд.

Обязательно используйте ReportProgress в вашем Backgroundworker, чтобы уведомить ваш Progressbar.

Хорошие ссылки, которые стоит изучить:

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