Отчет о ходе выполнения в родительский поток пользовательского интерфейса - PullRequest
0 голосов
/ 23 марта 2011

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

У меня есть пользовательский интерфейс, который запускает System.Timers.Timer.Каждый раз, когда этот таймер истекает, он запускает рабочий процесс, который открывает экран прогресса.Чтобы предотвратить запуск другого рабочего процесса до его завершения, он блокирует объект в главной форме.Этот экран выполнения запускается и сообщает о ходе копирования некоторых файлов с помощью FileCopyEX.

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

Надеюсь, это прояснит ситуацию:

Основная форма |Таймер истекает |WorkFlow начинается |Откроется экран прогресса (возникающие ошибки возвращаются к предыдущему) |Происходит копирование файла (прогресс возвращается на экран прогресса). Если ошибок нет, возврат к главному экрану до следующей отметки.

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

Спасибо

Ответы [ 2 ]

1 голос
/ 23 марта 2011

Предлагаю вам прочитать про BackgroundWorker. У этого есть крюки для сообщения о прогрессе.

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

1 голос
/ 23 марта 2011

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

Надеюсь, что это имеет смысл!

...