从非 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)
代替。
我正在尝试使用 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)
代替。