You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET WinForms使用FileStream读取回车时二次点击程序冻结问题

问题原因分析

你的代码出现首次正常、二次冻结的核心问题出在未处理FileStream.Read的返回值,导致遍历了大量空字符(ASCII NUL)到TextBox中,具体拆解:

  1. 你定义了一个100字节的数组contenu(100),但FileStream.Read只会把文件实际存在的字节(比如你的示例里是A、\r、\n、B,共4个字节)填充到数组开头,剩下的96个字节都是默认值0(对应ASCII的NUL空字符)。
  2. 你遍历了整个数组的所有100个元素,把每个字节转成字符后添加到TextBox1.Text里——这意味着你往TextBox里塞了96个NUL字符。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 20:17:03