Лучшая практика для управления занятым графическим интерфейсом - PullRequest
2 голосов
/ 28 марта 2010

Предположим, графический интерфейс (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;
}

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

Ответы [ 4 ]

6 голосов
/ 28 марта 2010

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

2 голосов
/ 28 марта 2010

Другие упоминали об использовании BackgroundWorker для запуска вашей работы. Это то, что вы делаете?

В любом случае, если вам интересно, каков наилучший способ обновления пользовательского интерфейса из фонового потока, то, что вы делаете, выглядит нормально, хотя я рекомендую использовать Invoke вместо BeginInvoke. Кроме того, вместо того, чтобы объявлять свой собственный отдельный делегат, вы можете использовать MethodInvoker для упрощения вашего кода:

StatusLabel.Invoke(new MethodInvoker(delegate() { /* Update control here */ }));
2 голосов
/ 28 марта 2010

Рекомендуется использовать BackgroundWorker для запуска длительной задачи.Это специальный класс потоков, созданный специально для WinForms, как раз для этой цели.Вы можете отправить ему работу, отменить ее, а также разрешить ей отправлять сообщения обратно в поток WinForm для обновления статуса.По сути, используя BackgroundWorker, ваш графический интерфейс остается свободным и активным.

1 голос
/ 28 марта 2010

Это выглядит правильно для меня. До тех пор, пока вы инкапсулируете подобные вещи в свой собственный хорошо протестированный класс, с ним не должно быть проблем.

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