JsonTextReader.ReadAsync对取消没有反应

时间:2017-07-24 16:19:25

标签: rest azure json.net async-await office365

我正在实施一个依赖Office365 API Streaming Subscriptions的应用程序。在收听订阅时,我正在阅读POST请求几乎无限的结果。实际上我正在获得一个包含单个JSON对象的流,该对象以一些预热属性开始并具有一系列事件。 我正在使用JsonTextReader来解析流。有一个while (await jsonReader.ReadAsync(readCts.Token))...循环可以无缝地解析流。

它工作得很好......好吧,差不多。 在预定义的时间间隔内,我收到KeepAlive通知。读者正在识别它们,因此我想使用它来重置readCts CancellationTokenSource超时。如果当时没有到达通知,则应取消读取操作。到现在为止还挺好。但基于超时的取消仅在底层网络连接正常时才起作用(通过设置超时小于keepalive事件间隔来模拟)。

中断连接后,此异步操作挂起,取消令牌对其没有影响。并且逻辑连接也会丢失,重新建立物理连接不会恢复流。

我已经尝试过设置HttpClient实例的超时,但这也没有任何影响。最后,我通过设置WinHttpHandler.ReceiveDataTimeout来管理它。但为此,我正在使用一个单独的HttpClient实例。

1)上述取消行为是否正常? 2)我知道,应该重用HttpClient实例。但通常API调用不会运行数小时。我可能会同时进行几次这样的调用。我可以共享一个HttpClient实例,还是需要和我一样多的并行请求?

谢谢。

0 个答案:

没有答案