SignalR hub方法不报告对IProgress.Report的所有调用

时间:2016-05-04 10:39:55

标签: c# asp.net signalr signalr-hub signalr.client

我的情况是,我的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) 在服务器方法的最后,以避免竞争条件。这不太理想......

这是一个错误还是我错过了什么?

由于

0 个答案:

没有答案