Писать статусные сообщения в текстовое поле асинхронно? - PullRequest
2 голосов
/ 23 апреля 2010

Я недавно начал программировать в WinForms с использованием C #. У меня есть требование, где мне нужно искать набор папок и подпапок и отображать информацию о состоянии в текстовое поле, как я делаю поиск, как -

Поиск папки "C: \ Windows" ...
Найдено 8 файлов ...
Копирование файла 1 из 8 в «D: \ Temp» ...

У меня есть метод, который выполняет весь поиск и прочее. Я не знаю, как отображать сообщения о состоянии (как выше) в текстовое поле периодически. В настоящее время форма ожидает завершения метода и отображает все сообщения сразу. Я хочу, чтобы они отображались один за другим по мере продвижения метода.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 23 апреля 2010

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

Самый простой способ сделать это в приложении WinForms - это использовать BackgroundWorker . Он имеет минимум поддержки для запуска задачи в фоновом режиме и возврата информации о ходе выполнения в поток пользовательского интерфейса. Кроме того, в Интернете доступно множество учебных пособий, которые помогут вам начать работу с решением.

1 голос
/ 23 апреля 2010

Запустите метод, который выполняет поиск в отдельном потоке (если вы этого еще не сделали). Это довольно просто, используя функции асинхронного делегата в .NET .

Затем вы можете записать в текстовое поле из рабочего потока команду Control.BeginInvoke () - вы должны сделать это, потому что доступ к управлению пользовательским интерфейсом ограничен одним потоком пользовательского интерфейса.

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

1 голос
/ 23 апреля 2010

используйте BackgroundWorkerThread и функцию ReportStatus. Таким образом, ваш пользовательский интерфейс будет реагировать во время поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...