我的情况是,我的javascript应用程序使用带有signalR代理的Web套接字回调到服务器。
我有一个长期运行的方法,我报告进度10次。
但是我发现客户端进程回调并不总是被调用10次,即使服务器方法肯定会调用它10次。
为简洁起见,这里是简化的服务器方法伪代码:
public async Task LongRunning(IProgress<Something> progress)
{
var things = await Get10ThingsFromDb();
foreach (var thing in things)
{
var something = ComputeSomething(thing);
progress.Report(something);
}
}
请注意,在最后一次调用progress.Report之后,该方法会立即完成。
大部分时间它工作正常,但也许每5次我报告的次数少于10次,有时甚至只有1次。
我检查过Chrome中的网络标签,似乎问题是服务器有时会在发送所有报告之前发送方法完成结果。
因此,在正常情况下,服务器发送以下帧
- 报告10次
- 完成1次
但在失败的情况下,服务器会发送以下帧。
- 报告7次
- 完成1次
- 报告3次
我的猜测是js客户端会丢弃完成后发生的任何进度报告。
我最后添加了await Task.Delay(100)
在服务器方法的最后,以避免竞争条件。这不太理想......
这是一个错误还是我错过了什么?
由于