使用 signalR 和 async await 关键字通知 asp.net 核心中异步长作业的进度

Notify progress in asynchronous long jobs in asp.net core with signalR and async await keyword

在我的 asp.net 核心 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);
    }

    ...

我会在工作期间返回百分比。

这里的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。