Я использовал AOP , чтобы справиться с этим. Все вызовы методов просмотра перехватываются и синхронизируются с потоком пользовательского интерфейса. Мы настроили нашу платформу AOP (spring.net), чтобы сделать это для всех интерфейсов, которые наследуются от нашего IView
базового интерфейса. На докладчиках мы используем атрибуты, чтобы указать, что эта медленная операция должна выполняться в фоновом режиме. Методы презентатора выглядят примерно так:
// ...
[RunInBackground]
public void TakeSomeTimeToRetrieveSomeItems
{
var items = _svc.GetSomeItemsFromTheWeb();
_view.ShowItems(items); // synced to UI automatically; blocks in presenter
}
По нашему мнению, нам не нужно делать ничего особенного:
// ...
public void ShowItems(IList<Item> items)
{
itemBindingSource.DataSource = items;
}
Использование AOP не является тривиальным, если вы с ним не знакомы, но в данном конкретном случае это сэкономило нам тонны кода инфраструктуры в пользовательском интерфейсе, и теперь мы можем разработать адаптивный интерфейс практически без усилий.