Традиционно такая работа выполняется с помощью BackgroundWorker
По сути, это простой класс, который дает вам возможность выполнять функцию в рабочем потоке, а затем автоматически вызывает обратно в поток пользовательского интерфейса после завершения этой функции. Во время выполнения функции пользовательский интерфейс разблокирован и может отображать сообщение о ходе выполнения или обрабатывать другой пользовательский ввод (например, отмена).
Результат похож на ваш шаблон, но для каждой задачи создается и уничтожается отдельный поток (ну, на самом деле, существует пул ...).
UI thread ---> Show splashscreen------------------->Show window-------
| |return to UI |
| create background worker | |
-> Process user ------------ ->Perform query etc.
Хорошо, основываясь на вашем комментарии:
Вы можете использовать такой шаблон, это простой случай событий. Предоставьте пользовательскому интерфейсу доступ к своему менеджеру, чтобы он мог выполнять вызов метода и регистрировать события по завершении задачи ( эта ссылка показывает два основных шаблона для асинхронных операций в .NET). Внутри менеджера вам нужно будет поддерживать список задач, которые можно выполнить последовательно в одном потоке, и убедиться, что события, вызываемые для возврата результатов в пользовательский интерфейс, правильно вызываются для запуска в основном потоке пользовательского интерфейса. (в основном воссоздайте шаблон рабочего фона).
Я не уверен, что вы надеетесь получить от этого, есть ли причина, по которой приложение должно быть ограничено двумя потоками? Вы обеспокоены стоимостью создания фоновых рабочих? Вам нужна какая-то система очередей запросов? Примеры в диаграмме в вашем вопросе, кажется, не требуют сложности такого рода паттернов.