Приложение Windows Form, выполняющее тяжелую обработку в отдельной ветке. Где-то в процессе обработки мне нужно получить некоторую обратную связь от пользователя (например, задавать некоторые вопросы о визуальном выходе на другое устройство). Если бы я сделал это в слое пользовательского интерфейса, я был бы более чем счастлив использовать контрольный Invoke
и сделать это. Обработка выполняется в бизнес-слое. Я спросил каждого в бизнес-слое, никто не знает ключевое слово, например Control
, Invoke
, MainForm
и т. Д. Как я могу уведомить основную форму и получить вход? (события? или я пропустил что-то простое?)Вызов из фоновой нити в многоуровневом приложении
ответ
Вам нужно будет передать ваш запрос вверх из бизнес-уровня, а затем вызвать его из уровня представления в пользовательском интерфейсе.
Один из способов сделать это, как вы предложили в своем комментарии, - использовать событие, которое запускается с бизнес-уровня и обрабатывается вашим уровнем представления, но это зависит от того, хотите ли вы архитектовать свое приложение для связи между слоями с использованием событий.
Мое личное предпочтение заключается в том, чтобы слои связывались напрямую друг с другом, поэтому в этом случае я бы обменивался бизнес-слоем с уровнем представления, который запрашивается с помощью ввода, а затем уровень представления будет маршализовать запрос сам вид (UI) через Invoke
.
Один из способов - создать event на вашем бизнес-уровне, с которого вы подключаетесь из своего кода управления/формы. Когда ваш элемент управления/формы получает событие, маршал обратно в поток пользовательского интерфейса, вызывающий Invoke/BeginInvoke, чтобы обновить ваш контроль (ы) соответственно.
Например, в вашем коде модели:
public class ModelFoo
{
public event EventHandler SomethingInterestingHappened;
...
при вызове (или трансляции) событие, это обычная практика, чтобы сделать это с помощью метода «On» (make the call thread-safe - смотри также this):
private void
OnSomethingInterestingHappened
()
{
var SomethingInterestingHappenedCopy = SomethingInterestingHappened;
if (SomethingInterestingHappenedCopy != null)
{
// TODO add your event data in the second args here
SomethingInterestingHappenedCopy (this, EventArgs.Empty);
}
}
Тогда подписаться на него с вашего UI потока, например:
ModelFoo.SomethingInterestingHappened += SomethingInterestingHappenedHandler;
Где:
private void SomethingInterestingHappenedHandler(object sender, EventArgs e)
{
// You can call if(this.InvokeRequired) here, since
// you might already be on the UI thread.
// However from other threads call Invoke/BeginInvoke if wanting
// to process synchronously/asynchronously depending on what you need and
// you need to update a control object.
Invoke(new MethodInvoker(delegate
{...
Я нахожу событие невероятно полезно, поскольку feels like вы развязка интерфейса от модели хорошо. События также могут быть определены на интерфейсе, поэтому код пользовательского интерфейса может говорить с чем-то абстрактным, что означает, что при необходимости можно изменить базовый тип (например, для тестирования).
- 1. Стоп CFRunLoop фоновой нити
- 2. Запуск фоновой нити в python
- 3. Распространение нагрузки более равномерно из фоновой нити
- 4. Зависимости сборки в многоуровневом приложении
- 5. Вызов методов в многоуровневом наследовании
- 6. Запрос скалярных значений из основной нити managedobjectcontext из фоновой темы
- 7. отображение изображений в пользовательском интерфейсе из фоновой нити в blackberry
- 8. Аналог фоновой нити в проекте VSIX?
- 9. Нерест фоновой нити в веб-службе tomcat
- 10. Метод фоновой нити не решает проблему замораживания
- 11. Модуль тестирования фоновой нити с интерфейсом
- 12. Доступ к текущей фоновой нити VB.NET VS2008
- 13. Расположение зависимостей Hibernate в многоуровневом приложении
- 14. Получение просмотра списков в многоуровневом приложении
- 15. C# Выполнить метод после завершения фоновой нити
- 16. Обратный вызов основной нити при завершении нити
- 17. Отображать пользовательский интерфейс, из фоновой нити без нарушения потока
- 18. Уведомление о тосте не удается из фоновой нити
- 19. Qt: безопасно ли излучать сигналы из фоновой нити?
- 20. Вызов не класс нити от нити
- 21. Обработка ошибок в многоуровневом приложении WinForm
- 22. Архитектура WPF MVVM в многоуровневом прикладном приложении
- 23. Включить миграцию в многоуровневом MVC-приложении
- 24. Нежелательные нити в JavaFX приложении
- 25. Открыть модальную форму из фоновой нити, чтобы заблокировать поток пользовательского интерфейса без блокировки фоновой темы
- 26. Вызов фоновой службы от BroadcastReceiver
- 27. Отмените или уничтожьте петлю фоновой нити на viewcontroller close
- 28. Ограничение времени для «фоновой нити» в Google App Engine
- 29. QThread: Вызов сигнала в правой нити
- 30. Можно ли рисовать холст с помощью фоновой нити?
Вы должны реализовать его как событие или услугу, в основном спросите «кто-нибудь имеет какие-либо данные в этом процессе», позвонив в службу или уволив событие. Вы должны подумать о том, что должно произойти, если нет службы или обработчика событий, это нормально, просто нет ввода или это ошибка? Тот факт, что этот вопрос должен быть задан пользователю, который должен произойти в потоке пользовательского интерфейса, - это не то, что вы должны касаться того слоя, с которым имеете дело сейчас. –