В моем веб-приложении asp.net core 2.1 у меня есть раздел администратора, в котором я выполняю длительные операции в виде таблиц синхронизации из одной базы данных в другую.
Я использую Signalr, чтобы уведомить клиента о прогрессе.
Все работы (клиент и сервер), но уведомление о прогрессе никогда не выполняется.
Уведомляется только об окончании работы (100% выполненных работ)
Я заметил, что проблема в счетчике внутри цикла, который не увеличивается во время работы.
Я думаю, потому что асинхронный код и новый поток.
Таким образом, чтобы лучше понять, я упрощаю проблему на минимальном уровне
и надеюсь, что кто-то поможет решить и понять.
private async Task PerformBackgroundJob(string jobId)
{
var taskList = new List<string>
{
"task1", "task2", "task3"
};
int processed = 0;
foreach (var task in taskList)
{
switch (task)
{
case "task1":
await DoSome1();
processed++;
break;
case "task2":
await DoSome2();
processed++;
break;
case "task3":
await DoSome3();
processed++;
break;
}
await _hubContext.Clients.Group(jobId).SendAsync("progress", processed / taskList.Count * 100);
}
}
private async Task DoSome1()
{
await Task.Delay(5000);
}
...
Я бы во время работы процент вернул.