ожидание соединения npgsql с ssl - PullRequest
0 голосов
/ 18 декабря 2018

Я настраиваю слушателя для уведомления от postresql через npgsql в vb.net.Подпрограмма просто открывает новое ssl-соединение и запускает новый поток с циклом, ожидающим уведомления.Ниже приведен код

Public Sub StartListening()
    If mConnString Is Nothing Then
        Main_Form.WriteMessage("Not connected")
    End If
    Try
        connection = New NpgsqlConnection(mConnString) With {
            .ProvideClientCertificatesCallback = New ProvideClientCertificatesCallback(AddressOf MyProvideClientCertificates)
        }
        connection.Open()
        If connection.State = ConnectionState.Open Then
            Using command = New NpgsqlCommand("listen my_notification", connection)
                command.ExecuteNonQuery()
            End Using
        End If

        AddHandler connection.Notification, New NotificationEventHandler(AddressOf OnNotification)
        Dim thread As New Thread(
            Sub()
                While True
                    connection.Wait()
                End While
            End Sub
        )
        thread.Start()

    Catch ex As Exception
        Main_Form.WriteMessage("Error:" +  ex.Message)
    End Try
End Sub


Private Sub MyProvideClientCertificates(ByVal clienteCertis As X509CertificateCollection)
    Dim cert As X509Certificate2 = New X509Certificate2("mycertificate.pfx")
    clienteCertis.Add(cert)
End Sub

Все работало нормально, пока я не установил SSL-соединение: оно не работает на connection.Wait () говоря

Wait () с тайм-аутом не поддерживается при использовании SSL, см. https://github.com/npgsql/npgsql/issues/1501

Поскольку на самом деле тайм-аут мне не нужен, я попытался установить timeout = 0 и commandtimeout = 0 в строке подключения, но ошибка все еще остается, и это то, что я вижу в трассировке стека ошибок

в Npgsql.NpgsqlConnector.Wait (Int32 timeout)

в Npgsql.NpgsqlConnection.Wait (Int32 timeout)

в Npgsql.NpgsqlConnection.Wait ()

Может кто-нибудь помочь?

1 Ответ

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

Я нашел решение.Я пишу здесь на всякий случай, если у кого-то еще есть такая же проблема.

Я изменил Wait () с WaitAsync () .

Чтобы избежать непрерывного зацикливания, также добавлено Await и объявление сабвуфера как Async .

Ниже приведен код

        ....
        Dim thread As New Thread(
            Async Sub()
                While True
                    Await connection.WaitAsync()
                End While
            End Sub
        )
        thread.Start()
        ....
...