2017-03-22 31 views
0

Webサイトがアップまたはダウンしているかどうかをチェックするために使用されるvb.netアプリケーションにTimerコントロールを追加しました。アプリには2つのタイマーコントロールがあります。どちらもSystem.Windows.Forms.Timerのものです。VB.Net - Timer Controlはアプリケーションをフリーズします

Timer1とTimer2があります。 Timer1はウェブサイトのチェックを実行するために使用されます。 Timer2は、フォームのベースにあるToolStripに現在の日付と時刻を表示するだけです。 Timer2は問題なく時間を表示しますが、Timer1を実行するWebサイトのチェックを開始すると、2回チェックした後にアプリケーションがフリーズします。時にはそれはより長く実行されますが、最終的にフリーズします。

アプリケーションをシャットダウンするには、タスクマネージャ内からタスクを終了する必要があります。私はデバッガ内と実行可能ファイルの実行後にこれをテストしました。私も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 
+0

'Timer'はコントロールではありません。コントロールとして、クラスは 'System.Windows.Forms.Control'クラスを直接的または間接的に継承しなければなりません。その 'Timer'クラスはそうではありません。これはコンポーネントで、IComponentインターフェースを実装しているため、デザイナーで使用する必要があります。コントロールは特殊なタイプのコンポーネントです。 – jmcilhinney

+1

すべての背景[スレッド]を呼び出す(https://msdn.microsoft.com/en-us/library/system.threading.thread(v = vs.110).aspx)! –

答えて

2

Timer1_Tickメソッドが完了するまで、アプリケーションのUIが「フリーズ」します。おそらくあなたのTimer1_TickDo...Loopが終了していない可能性があります。 DoLoop行を削除してみてください。

+1

ループを削除するのではなく、実際にコードをデバッグして、ループが終了しない理由を確認する方がよいでしょう。 – jmcilhinney

+0

私はDo ... Loop全体を削除しました。アプリケーションはまだ "フリーズ"します。 –

+0

@ J.Yonan - そうは思わない。まだ "フリーズ"している更新されたコードを投稿できますか? (そしてなぜあなたは二重引用符で "フリーズ"をしたのですか?) – Enigmativity

関連する問題