Я пытаюсь создать приложение для Windows Forms в стиле MVP и - не особо разбираясь с многопоточностью - все запутывается.
Мой интерфейс представляет собой набор очень простых форм. Каждая из форм реализует интерфейс и содержит ссылку на класс-посредник, который находится на уровне бизнес-логики и наоборот.
Так как упрощенная схема выглядит так:
CheckInForm : ICheckIn <-------> CheckInMediator : ICheckInMediator
----------------------------------------------------------------------------------------
CheckInForm.Show() <--------
--------> AttemptCheckIn(CheckInInfo)
CheckInForm.DisplayCheckInInfo(DisplayInfo) <--------
--------> CompleteCheckIn(AdditionalCheckInInfo)
PleaseWaitDialog.Show() <--------
PleaseWaitDialog.Close() <--------
CheckInForm.Close() <--------
Как вы можете видеть, классы-посредники управляют пользовательским интерфейсом, сообщая ему, когда отображать данные, запускать, закрывать и т. Д. Они даже указывают, когда должен появиться модальный диалог и когда он должен закрыться (например, PleaseWaitDialog выше). Единственное, что делает пользовательский интерфейс, это показывает данные на экране и ретранслирует вход обратно посреднику.
Эта архитектура приятна и отделена, и ее было очень легко протестировать и создать прототип. Теперь, когда я собираю все это вместе, я начинаю сталкиваться с проблемами потоков. Например, если я хочу, чтобы мой PleaseWaitDialog отображался в виде модальной формы (с использованием ShowDialog ()) поверх CheckInForm, пока таймер, управляемый посредником, не отсчитал 5 секунд (помните, это упрощение), я получу ошибку перекрестного потока если я позвоню PleaseWaitDialog.Close () из обратного вызова таймера. Аналогичным образом, если у меня есть модальное диалоговое окно, блокирующее взаимодействие пользователя с пользовательским интерфейсом, я не хочу, чтобы это блокировало активность на бизнес-уровне, если не указано иное (например, в диалоговом окне подтверждения).
То, что я хотел бы сделать, это запустить посредники и бизнес-логику в основном потоке, а пользовательский интерфейс - в совершенно отдельном потоке, и мой первый вопрос: имеет ли это смысл?
Мой второй вопрос: как мне сделать что-то вроде запуска класса в отдельном потоке? И как мне два общаться? Я пробираюсь сквозь чтение по многопоточности .NET, но у меня есть крайний срок, и некоторые примеры того, как заставить класс в главном потоке порождать поток, содержащий пользовательский интерфейс, и заставить их объекты взаимодействовать друг с другом, могут действительно помочь.