0

我有以下代码:

Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim mesaj As New Integer

        My.Computer.Network.DownloadFile("http://rotutorial.net/anunt.txt", "c:\classmate\msg1.txt", "", "", False, 60000, True)
        Dim readtext As New System.IO.StreamReader("c:\classmate\msg1.txt")
        Dim text As String
        text = readtext.ReadToEnd
        readtext.Close()
        Dim parti(10) As String
        parti = text.Split("_")

        Dim writetext1 As New System.IO.StreamReader("c:\classmate\msg.txt")
        Dim text1 As String
        Dim parti1(10) As String
        text1 = writetext1.ReadToEnd
        parti1 = text1.Split("_")

        writetext1.Close()
        Dim unic As New Integer
        unic = Val(parti(0))
        Dim unic1 As New Integer
        unic1 = Val(parti1(0))

        If unic <> unic1 Then
            If unic <> unic1 Then
                mesaj = MsgBox(parti(3), vbYesNo, "Mesaj")
            End If
            Dim writetext2 As New System.IO.StreamWriter("c:\classmate\msg.txt")
            Dim text2 As String
            text2 = text & "/" & text1
            writetext2.Write(text2)
            writetext2.Close()

            Timer1.Enabled = False
            Timer1.Enabled = True
        End If
        Timer1.Enabled = False
        Timer1.Enabled = True






    End Sub

计时器间隔设置为 5000(5 秒),但每次计时器计时时,msgbox 都会出现在屏幕上,但文件 msg.txt 中会写入一次。因此,计时器检查该 unic 是否与 unic1 不同,如果不同则显示一个 msg 框,它在 msg.txt 中写入新行,但在下一个计时器滴答时,即使 unic 和 unic1 等于 msgbox无论如何都会出现,但它更有趣,因为它不会再次写入文件,只会显示 msgbox。我不明白这一点。

抱歉我的英语不好,我来自罗马尼亚。

谢谢!

4

1 回答 1

2

如果在错误的地方出于正确的原因使用消息框,可能会有点危险。这是其中之一。问题是它相当于在一个循环中调用 DoEvents,旨在保持消息循环可操作。这样 Windows 消息(如消息框的 Paint 事件和输入事件)就可以正常发送和处理。这可以防止您的 UI 冻结。

然而,这可能会导致重入问题。消息框通过禁用应用程序中的所有窗口来解决最严重的问题。请注意单击其中一个窗口时发出的哔声。但是,这不会阻止 Timer 消息。因此 5 秒后,您的 Timer1_Tick() 方法再次运行。显示另一个消息框。等待足够长的时间关闭它们,您的屏幕就会充满消息框。您可能会因为文件操作代码多次运行而遇到其他问题。

解决方法很简单,只需在方法开始时禁用 Timer。最后重新启用它。BackgroundWorker 也是此类代码中的常见选择,它可以防止缓慢的文件下载冻结您的 UI。

于 2012-06-02T14:32:15.450 回答