Андрей
Я не говорил, что слишком сложные вычисления, по сути, вы сами ответили на вопрос )
Если много межпоточных взаимодействий, то я бы у себя завёл отдельный поток, который разруливает их.
Если работа с базой данных нагруженная - то и для работы с базой отдельный поток.
Задача потока GUI - отобразить список папок, людей или календарь, показать превьюшки, которые сейчас на экран вошли либо одну большую картинку, а также дополнительные данные. Если для отображения нужно получить данные - поток GUI отправляет задание в другие потоки. По завершению работы те потоки готовят данных для GUI в максимально препарированном виде и сообщают о готовности в поток GUI, тот просто отображает эти данные.
Примерно по такому сценарию мы избавлялись от подвисаний в нашем софте.