Уведомлять о прогрессе в асинхронных длинных заданиях в ядре asp.net с ключевым словом signalR и async await - PullRequest
0 голосов
/ 18 мая 2019

В моем веб-приложении 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);
    }

    ...

Я бы во время работы процент вернул.

1 Ответ

1 голос
/ 18 мая 2019

Здесь нет проблем с SignalR.Вы просто делите int на int, получая результаты как int с округлением до нуля, то есть:

  • (1/3 = 0) * 100 = 0
  • (2/ 3 = 0) * 100 = 0
  • (3/3 = 1) * 100 = 100

Просто измените int processed = 0; на double processed = 0;, и вы получите 33,33,66,67 и 100,00.

...