Неплохо было бы сделать rest api, на стороне сервера, и стучать в него с клиентской части (html+js+ajax, или разобраться с vuejs и использовать его).
В api сделать:
- ручку для постановки задачи в очередь (rabbitmq, kafka, db)
- ручку для проверки статуса задачи
- ручку для получения результатов, если задача в статусе "выполнено"
Соответственно, с клиента дергать первую ручку, затем крутить прелоадер и периодически дергать вторую ручку, пока не получим нужный статус задачи, или не закончится какой-нибудь таймаут, и в конце дернуть третью ручку и поменять текущий DOM с учетом полученных данных.
На серверной части, по идее, можно отказаться от зоопарка из php+c#, и сделать это все на чем-то одном. Сами задачи будут обрабатываться чем-то в вечном цикле, а именно - ждать пока в очереди появятся задачи и сразу брать их в работу (при необходимости запустить несколько таких воркеров, и обрабатывать задачи параллельно)