【问题标题】:Is it necessary to stop/close SignalR stream with CancelationToken.Cancel()?是否有必要使用 CancelationToken.Cancel() 停止/关闭 SignalR 流?
【发布时间】: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


【解决方案1】:

打破循环很好。该方法是生产流项目的方法,或者更具体地说是向 SignalR 提供流项目的方法,因此,如果您中断循环,则从 SignalR 的角度来看,您将停止生产项目。文档中提到了令牌,因为客户端可以断开连接或取消对流的侦听,而您的服务器可能希望在这种情况下停止做额外的工作。

【讨论】:

    猜你喜欢
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 2021-12-08
    • 2019-05-20
    相关资源
    最近更新 更多