VB.NET WinForms使用FileStream读取回车时二次点击程序冻结问题
问题原因分析
你的代码出现首次正常、二次冻结的核心问题出在未处理FileStream.Read的返回值,导致遍历了大量空字符(ASCII NUL)到TextBox中,具体拆解:
- 你定义了一个100字节的数组
contenu(100),但FileStream.Read只会把文件实际存在的字节(比如你的示例里是A、\r、\n、B,共4个字节)填充到数组开头,剩下的96个字节都是默认值0(对应ASCII的NUL空字符)。 - 你遍历了整个数组的所有100个元素,把每个字节转成字符后添加到
TextBox1.Text里——这意味着你往TextBox里塞了96个NUL字符。 - WinForms的TextBox底层依赖Windows原生的EDIT控件,这个控件对NUL字符的处理有缺陷:NUL字符被当作字符串的终止符,当控件Text中包含NUL字符后,后续的文本修改操作会打乱控件内部的消息处理逻辑。第一次点击时,控件还能勉强完成渲染,但第二次修改Text时,在处理
Chr(13)(回车符)的过程中,控件内部触发了阻塞,导致UI线程冻结。
另外,你的Try-Catch块是空的,完全屏蔽了可能抛出的异常,这也让你无法直观看到NUL字符引发的控件错误。
如果你要验证这个结论,可以修改代码,只遍历FileStream.Read实际返回的字节数:
Using fichier As FileStream = New FileStream("first.txt", FileMode.OpenOrCreate) If fichier.CanRead() Then Dim contenu(100) As Byte Dim bytesRead As Integer = fichier.Read(contenu, 0, 100) ' 捕获实际读取的字节数 TextBox1.Text = String.Empty Try For i As Integer = 0 To bytesRead - 1 ' 只遍历实际读取的字节 TextBox1.Text += Chr(contenu(i)) Next Catch ex As Exception MessageBox.Show(ex.Message) ' 不要空捕获,至少看错误 End Try End If End Using
这样修改后,不管点击多少次都不会冻结,因为不会再往TextBox里添加NUL字符了。
内容的提问来源于stack exchange,提问作者Loy
相关产品推荐
相关产品推荐

