在不冻结程序的情况下在后台执行某些操作

时间:2019-08-12 13:59:53

标签: vb.net

在我的程序中,我有一个计时器,该计时器检查以确保您已连接到Internet并检查您是否已连接到VPN。代码很简单

 Public Function IsInternetConnected() As Boolean
    If My.Computer.Network.Ping("google.com", 2000) Then
        Return True
    Else
        Return False
    End If
End Function
Public Function IsVPNConnected() As Boolean
    If My.Computer.Network.Ping("10.0.2.29", 2000) Then
        Return True
    Else
        Return False
    End If
End Function

问题在于,每次检查程序时,该程序都会挂起几秒钟,并且不允许您执行其他任何操作。有没有一种方法可以让我不断检查它而不冻结应用程序?

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

    If IsVPNConnected() = True Then
        BtnVPN.BackColor = Color.LightGreen
        BtnVPN.Text = "Connected"
    Else
        BtnVPN.BackColor = Color.Red
        BtnVPN.Text = "Disconnected"
    End If

    If IsInternetConnected() = True Then
        BtnInternet.BackColor = Color.LightGreen
        BtnInternet.Text = "Connected"
    Else
        BtnInternet.BackColor = Color.Red
        BtnInternet.Text = "Disconnected"
    End If

End Sub

3 个答案:

答案 0 :(得分:1)

执行ping需要花费很长时间。也许尝试使用:System.Net.Dns.GetHostAddresses("www.google.com")代替。

不管别人怎么说,您都需要在新线程中运行检查代码。在此处查看答案:Create a new thread in VB.NET

答案 1 :(得分:0)

您需要将功能放在后台工作器中,然后在需要当前功能的功能时直接调用后台工作器,而不是直接调用功能。这将防止您的应用程序在功能运行时冻结。

它会变成这样:

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    SyncLock internetconnected
        If My.Computer.Network.Ping("google.com", 2000) Then
            internetconnected = True
        Else
            internetconnected = False
        End If
    End SyncLock
End Sub

然后,当您希望背景工作人员执行以下操作时,您将其称为:

BackgroundWorker1.RunWorkerAsync()

答案 2 :(得分:0)

我会摆脱计时器,而改用任务。在这里,我已经在Shown事件中启动了任务。

jsPDF.from_html()