从非 UI 线程读取时标准输入已损坏

stdin is corrupt when reading it from non UI thread

我正在尝试使用 Google NativeMessaging 接收来自 Chrome 的消息,我的 WinForms 应用程序通过 Chrome 读取从我的分机发送的消息每 0.1 秒调用以下函数:

Public Function read_message() As String
        'Read in first 4 bytes for length...
        Dim stdin As Stream = Console.OpenStandardInput()

        Dim bytelen(LENGTH_BYTE_COUNT - 1) As Byte
        stdin.Read(bytelen, 0, LENGTH_BYTE_COUNT)

        Dim msglen As Integer = BitConverter.ToInt32(bytelen, 0)

        'Read the message
        Dim msg As String = ""
        For i As Integer = 0 To msglen - 1
            msg &= ChrW(stdin.ReadByte())
        Next i

        stdin.Close()
        stdin.Dispose()

        Return msg
    End Function

在我上面解释的场景中一切正常,但是,我希望这个函数在不同的线程中重复运行。

因此,当我创建新线程时,它具有相似的计时器和相似的间隔,结果变得一团糟,来自 Chrome 的短信重叠,有些消息只是错过了,有时 return 损坏的消息,我不明白为什么这在 UI 线程中完美运行,而在另一个线程中给出奇怪的结果,即使我放宽阅读时间间隔,任何线索?

P.S

作为附带问题,鉴于我必须使用 Winforms,我实际上不确定使用计时器从 stdin 读取消息是最好的方法,是否有更好的方法来检测消息何时 "arrives"进入标准输入流?

在此处找到解决方案:Very Slow to pass “large” amount of data from Chrome Extension to Host (written in C#)

问题是 stdin.ReadByte 运行很慢,应该用 StreamReader(stdin) 代替。