【问题标题】:VB.Net - Timer Control freezes applicationVB.Net - Timer Control 冻结应用程序
【发布时间】:2017-03-22 00:39:44
【问题描述】:

我在 vb.net 应用程序中添加了一个 Timer 控件,用于检查网站是否正常运行。应用程序中有两个计时器控件。两者都来自 System.Windows.Forms.Timer。

有 Timer1 和 Timer2。 Timer1 用于执行网站检查。 Timer2 只是在表单底部的 ToolStrip 中显示当前日期和时间。 Timer2 运行时显示时间没有问题,但是当我启动运行 Timer1 的网站检查时,应用程序在两次检查后冻结。有时它运行的时间更长,但最终会冻结。

我必须从任务管理器中结束任务才能关闭应用程序。我在调试器中并在运行可执行文件后对此进行了测试。我也完全删除了 Timer2 并进行了测试,但冻结仍然存在。这是我的代码。任何帮助将不胜感激。

Imports System


Public Class Form1

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        lblStatus.Text = ""
        Timer1.Stop()

        btnStart.Enabled = True
        btnStop.Enabled = False

    End Sub

    Public Function CheckAddress(ByVal URL As String) As Boolean
        Try
            Dim request As WebRequest = WebRequest.Create(URL)
            Dim response As WebResponse = request.GetResponse()
        Catch ex As Exception
            Return False
        End Try
        Return True
    End Function

    Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick

        Dim startPoint As Integer = -1

        If CheckAddress(txtAddress.Text).ToString() = True Then
            rtxtResults.AppendText(" -- " & txtAddress.Text & " - Website shows UP at " & tsClock.Text & " - " & vbNewLine)
        ElseIf CheckAddress(txtAddress.Text).ToString() = False Then
            rtxtResults.AppendText(" -- " & txtAddress.Text & " - Website shows DOWN at " & tsClock.Text & " - " & vbNewLine)
        End If

        Do
            startPoint = rtxtResults.Find("Website shows DOWN at", startPoint + 1, RichTextBoxFinds.None)
            If (startPoint >= 0) Then
                rtxtResults.SelectionStart = startPoint
                rtxtResults.SelectionLength = "Website shows DOWN at".Length
                rtxtResults.SelectionColor = Color.Red
            End If
        Loop Until startPoint < 0


    End Sub

    Private Sub Timer2_Tick(sender As System.Object, e As System.EventArgs)
        tsClock.Text = Now()
    End Sub

    Private Sub btnStart_Click(sender As System.Object, e As System.EventArgs) Handles btnStart.Click

        If txtInterval.Text = "" Then
            MsgBox("Must enter a number")
            Exit Sub
        End If
        lblStatus.ForeColor = Color.Green
        lblStatus.Text = "Running"
        btnStart.Enabled = False
        btnStop.Enabled = True
        Timer1.Interval = Int(txtInterval.Text) * 1000
        Timer1.Start()

    End Sub

    Private Sub btnStop_Click(sender As System.Object, e As System.EventArgs) Handles btnStop.Click
        lblStatus.ForeColor = Color.Red
        lblStatus.Text = "Stopped"
        btnStop.Enabled = False
        btnStart.Enabled = True

        Timer1.Stop()
    End Sub


End Class

【问题讨论】:

  • Timer 不是控件。要成为控件,类必须直接或间接继承System.Windows.Forms.Control 类。 Timer 类没有。它是一个组件,因为它实现了IComponent 接口,这是设计器中需要使用的全部内容。控件是一种特殊类型的组件。
  • 调用所有后台threads!

标签: vb.net timer


【解决方案1】:

您的应用程序 UI 将“冻结”,直到 Timer1_Tick 方法完成。很可能您的Timer1_TickDo...Loop 没有退出。尝试删除DoLoop 行。

【讨论】:

  • 与其删除循环,不如实际调试代码看看为什么循环永远不会退出。
  • 我消除了整个 Do...Loop。应用程序仍然“冻结”。
  • @J.Yonan - 我不相信会是这样。您可以发布仍然“冻结”的更新代码吗? (为什么你把“冻结”放在双引号中?)
  • @Enigmativity - 之前的响应者将我对“冻结”一词的使用框定在引号中。无论如何,我注释掉了 Timer1_Tick Sub 中的整个 Do...Loop 和 Dim 语句。应用程序在两次响应后仍然停止。
  • @J.Yonan - 是不是因为request.GetResponse() 耗时太长而冻结?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 2019-11-04
  • 2015-05-09
  • 2013-09-26
  • 2014-09-29
相关资源
最近更新 更多