Предположим, что GUI (C#, WinForms) выполняет работу и занят в течение нескольких секунд. Он будет иметь кнопки, которые должны оставаться доступными, этикетки, которые будут меняться, прогресс бары и т.д.Лучшая практика для управления занятым графическим интерфейсом
Я использую этот подход в настоящее время, чтобы изменить графический интерфейс пользователя, когда занято:
//Generic delegates
private delegate void SetControlValue<T>(T newValue);
//...
public void SetStatusLabelMessage(string message)
{
if (StatusLabel.InvokeRequired)
StatusLabel.BeginInvoke(new SetControlValue<string>(SetStatusLabelMessage, object[] { message });
else
StatusLabel.Text = message;
}
Я был используя это, как будто это выходит из моды, но я не совсем уверен, что это правильно. Создание делегата (и повторное использование) делает все чистое (для меня, по крайней мере), но я должен знать, что я не создаю монстра ...
У меня есть трудное время для согласования BackgroundWorkers и других потоков, используемых в программе. Как хорошо путешествующий джентльмен-программист, который вы видите чаще? Контроль через BackgroundWorker или Invoke? – MPelletier
@MPelletier: BackgroundWorker для такого рода задач - у вас есть долго работающая задача, вам нужно, чтобы GUI был несовместим, и вам нужно показать индикатор выполнения. Это именно то, для чего был создан BackgroundWorker. –
Я взял вопрос, чтобы быть более «лучшей практикой для обновления пользовательского интерфейса из фонового потока». Этот ответ действительно не затрагивает этот вопрос. –