使用 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。
在我的 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。