我有一个WPF应用程序,当单击按钮时,它会向ASP.NET Core 6 MVC应用程序发送请求。MVC控制器中的action方法接收请求,调用一个在for循环中运行长任务的方法,我试图使用SignalR来更新WPF应用程序中的标签,其中包含正在处理的循环迭代次数。
问题:在我单击该按钮后,标签在任务期间根本不会更改,只有当任务结束时,它才会更改以显示最后一次迭代的编号。
我猜这是同步/异步的问题,但我是一个新手,似乎仍然不能理解它…
这是WPF按钮处理程序:
private async void myButton_Click(object sender, RoutedEventArgs e) {
HubConnection connection = new HubConnectionBuilder().WithUrl("https://localhost:7036/miHub").Build();
await connection.StartAsync();
connection.On<string>("Notify", (str) => { lblProgress.Content = str; });
//calls mvc controller action
string url = "https://localhost:7036/Sincro/procesa";
using (var httpClient = new HttpClient()) {
string json = await httpClient.GetStringAsync(url);
}
}
这是控制器:
public class SincroController : Controller {
private readonly IHubContext<MiHub> _hubContext;
//ctor
public SincroController(IHubContext<MiHub> hubContext) {
_hubContext = hubContext;
}
public async Task<JsonResult> procesa() {
await longProcess();
var json = new { foo = "bar" };
return Json(json);
}
private async Task<int> longProcess() {
for(int row=0; row<5000; row++) {
await _hubContext.Clients.All.SendAsync("Notify", $"Processing thing {row}");
}
return 0;
}
}
1条答案
按热度按时间tcomlyy61#
在你的longProcess代码中,for循环实际上非常快,试试
Thread.Sleep(1500);
。测试结果
优化测试代码
我的测试结果
您的代码测试结果
样本编码