Обновление интерфейса из другого потока в C # - PullRequest
1 голос
/ 27 ноября 2010

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

Это хороший звонок или я должен написать все мои методы в Form.cs? Все примеры, найденные в сети, имеют методы в одном классе.

Проблема, с которой я сталкиваюсь: как обновить мои элементы управления в Form1. Если бы я поместил свои методы в класс Form, это было бы легко, я бы использовал:

if(this.InvokeRequired)
this.Invoke((Action)(() => richTextBox.Text += (line + Environment.NewLine)));

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

Ответы [ 6 ]

1 голос
/ 27 ноября 2010

Я хотел бы, чтобы все мои потоки содержались в файле .cs, отличном от Form1.cs.

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

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

1 голос
/ 27 ноября 2010

Код для фактического обновления элементов управления должен быть в вашем файле Form.cs.Точный способ выполнения обновления будет зависеть от того, как вы хотите запустить обновление.Я бы порекомендовал посмотреть на шаблон Model-View-Controller .Вы хотите отделить свою бизнес-логику для операций от своей формы, но ваша форма должна содержать элементы управления и логику для обновления этих элементов управления.

1 голос
/ 27 ноября 2010

Сохраняйте все манипуляции с пользовательским интерфейсом в Form.cs, например:

public void UpdateText(string text)
{
    if (InvokeRequired) Invoke(() = UpdateText(text));
    else myLabel.Text = text;
}

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

1 голос
/ 27 ноября 2010

Это хороший вызов, или я должен написать все свои методы в Form.cs?

Есть много веских причин отделить логику приложения от GUI.Например, если вы хотите написать два разных приложения, которые используют одну и ту же логику, вы можете поместить эту логику в свой собственный класс.Это также помогает разделить компоненты по ответственности (расчет против взаимодействия с пользователем), что может облегчить понимание и тестирование вашего проекта.Ваш подход разумный, хотя это означает, что у вас есть немного больше работы.

Проблема, с которой я сталкиваюсь, заключается в следующем: как обновить мои элементы управления в Form1.

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

0 голосов
/ 27 ноября 2010

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

0 голосов
/ 27 ноября 2010

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

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