【发布时间】:2022-02-11 07:34:26
【问题描述】:
我担心如何正确停止/关闭 SignalR 流。它是服务器到客户端的流式传输。
我将尝试解释流式传输的上下文。我们有网络服务连接到 IP 摄像机并用它打开流。稍后在服务中,我们对图像(帧)进行生物识别处理,然后将生物识别处理的图像流式传输到连接到 SignalR 流的客户端。连接的客户端不多,最多可能只有 2、3 或 4 个。
所以,我担心的是,如果某个客户端想要断开与流的连接,它是否需要调用 CancelationToken.Cancel() 或者我们可以让他从服务器上的 while(true) 循环中中断?当该客户端与流断开连接时,流应继续工作,因为其他客户端仍处于连接状态。
一些关于客户端如何从while(true) 循环中中断的简短示例。
public async IAsyncEnumerable<PreviewImage> StartStreamingPreviewImages(string deviceID, [EnumeratorCancellation] CancellationToken cancellationToken)
{
while(true)
{
if(client.WantToLeaveStream)
{
break;
}
}
...
或
public async IAsyncEnumerable<PreviewImage> StartStreamingPreviewImages(string deviceID, [EnumeratorCancellation] CancellationToken cancellationToken)
{
while(true)
{
if(cancellationToken.IsCancellationRequested)
{
cancellationToken.ThrowIfCancellationRequested();
}
}
...
我浏览了 Microsoft 网站 SignalR stream 上的文档,他们说我们应该使用 CancelationToken 来停止流式传输,但我也尝试通过离开 while(true) 循环来停止它,但没有发生任何不好的事情,流式传输刚刚停止。那样行吗? :/
【问题讨论】:
-
打破循环很好。该方法是生产流项目的方法,因此如果您打破循环,您将停止生产项目。文档中提到了令牌,因为客户端可以断开连接或取消对流的侦听,并且您的服务器可能希望在这种情况下停止工作。
-
@Brenan thx 的评论 :) 。只是想补充一点,在我们的例子中,流项目是由外部 IP 摄像机产生的,而 SignalR 流方法只是决定客户端应该获取(下载)哪个图像(帧)。
-
@Brenan 请您发布一个答案,以便我将其标记为已回答。
标签: c# asp.net-core signalr streaming cancellation-token