Поток не заканчивается - PullRequest
       30

Поток не заканчивается

0 голосов
/ 05 декабря 2018

Я пытаюсь написать клиент, который использует Server-Sent-Event, используя этот код:

Public Shared Function OpenSSEStream(ByVal url As String, ByVal _token As String, ByVal _identifier As String, ByVal _environment As String) As Stream
    Dim request = WebRequest.Create(New Uri(url))
    CType(request, HttpWebRequest).AllowReadStreamBuffering = False
    request.Headers.Add("Authorization:Bearer " + _token)
    request.Headers.Add("environment:" + _environment)
    request.Credentials = New NetworkCredential("id", _identifier)
    Dim response = request.GetResponse()
    Dim stream = response.GetResponseStream()
    SSEApplication.ReadStreamForever(stream)
    Return stream
End Function

Public Shared Sub ReadStreamForever(ByVal stream As Stream)
    Dim encoder = New UTF8Encoding()
    Dim buffer = New Byte(2047) {}

    While True
        If stream.CanRead Then
            Dim len As Integer = stream.Read(buffer, 0, 2048)
            If len > 0 Then
                Dim text = encoder.GetString(buffer, 0, len)
            End If
        End If
    End While
End Sub

Это прекрасно работает, так что я могу видеть текст с сервера (в режиме отладки) вПеременная текста.К сожалению, если я запускаю код (не отлаживая), я попадаю в режим прерывания.В режиме отладки я вижу, что текстовый файл заполнен примерно 2000 наборами данных, и похоже, что поток не заканчивается и переходит в бесконечный цикл или около того?Может ли кто-нибудь помочь мне здесь?

1 Ответ

0 голосов
/ 05 декабря 2018

Вам нужно выйти из цикла, сейчас ничего не сказано, чтобы он выходил.

While True
    If stream.CanRead Then
        Dim len As Integer = stream.Read(buffer, 0, 2048)
        If len > 0 Then
            Dim text = encoder.GetString(buffer, 0, len)
        Else
            Exit While
        End If
    Else
        Exit While
    End If
End While

Кроме того, поток может получать информацию только частями.Вам следует объединить данные.

Dim text As String = ""

While True
    If stream.CanRead Then
        Dim len As Integer = stream.Read(buffer, 0, 2048)
        If len > 0 Then
            text &= encoder.GetString(buffer, 0, len)
        Else
            Exit While
        End If
    Else
        Exit While
    End If
End While

Это может быть рефакторинг

Dim streamData As New StringBuilder

While stream.CanRead
    Dim len As Integer = stream.Read(buffer, 0, 2048)

    If len > 0 Then
        ' There is the possibility that a Unicode character be split
        streamData.Append(encoder.GetString(buffer, 0, len))
    Else
         Exit While
    End If
End While
...