Search code examples
vb.netformsanimationlagui-thread

How to prevent lag in form while moving?


When moving the form from side to side, it gives a small lag while checking every 5 seconds (using timer) a request in JSON from a website, is there any way to prevent this problem?

Sample Image

enter image description here

Here is the Code

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

    Try

        Dim jsonName = New IO.StreamReader(DirectCast(DirectCast(Net.WebRequest.Create("https://www.googleapis.com/youtube/v3/channels?part=snippet&id=" & ChannelID & "&fields=items(id%2Csnippet(title))&key=AIzaSyA1n4M-fo2Y5NHUj0RsvXEAis3H6_lIjRg"), Net.HttpWebRequest).GetResponse, Net.HttpWebResponse).GetResponseStream)
        Dim rqn As Newtonsoft.Json.Linq.JToken = Newtonsoft.Json.Linq.JObject.Parse(jsonName.ReadToEnd)
        ChannelName = $"{rqn.SelectToken("items")(0)("snippet")("title")}"

        Label3.Text = ChannelName

        Dim json = New IO.StreamReader(DirectCast(DirectCast(Net.WebRequest.Create("https://www.googleapis.com/youtube/v3/channels?part=statistics&id=" & ChannelID & "&fields=items(statistics(subscriberCount))&key=AIzaSyA1n4M-fo2Y5NHUj0RsvXEAis3H6_lIjRg"), Net.HttpWebRequest).GetResponse, Net.HttpWebResponse).GetResponseStream)
        Dim rq As Newtonsoft.Json.Linq.JToken = Newtonsoft.Json.Linq.JObject.Parse(json.ReadToEnd)
        Subs = $"{Convert.ToDecimal(rq.SelectToken("items")(0)("statistics")("subscriberCount")).ToString("#,###,###")}"

        Label1.Text = Subs

    Catch ex As Exception

        Timer1.Stop()
        MessageBox.Show("Erro ao tentar Conseguir os Dados do Canal!")

    End Try

End Sub

Solution

  • Using Asynchronous operations may solve your problem

    I can't properly test the code, but as shown bellow, changing the sub to a Async Sub and changing GetResponse to GetResponseAsync adding the await keword should do it.

    Private Async Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick 
    
        Try
    
            Dim jsonName = New IO.StreamReader(DirectCast(Await DirectCast(Net.WebRequest.Create("https://www.googleapis.com/youtube/v3/channels?part=snippet&id=" & ChannelID & "&fields=items(id%2Csnippet(title))&key=AIzaSyA1n4M-fo2Y5NHUj0RsvXEAis3H6_lIjRg"), Net.HttpWebRequest).GetResponseAsync, Net.HttpWebResponse).GetResponseStream)
            Dim rqn As Newtonsoft.Json.Linq.JToken = Newtonsoft.Json.Linq.JObject.Parse(jsonName.ReadToEnd)
            ChannelName = $"{rqn.SelectToken("items")(0)("snippet")("title")}"
    
            Label3.Text = ChannelName
    
            Dim json = New IO.StreamReader(DirectCast(Await DirectCast(Net.WebRequest.Create("https://www.googleapis.com/youtube/v3/channels?part=statistics&id=" & ChannelID & "&fields=items(statistics(subscriberCount))&key=AIzaSyA1n4M-fo2Y5NHUj0RsvXEAis3H6_lIjRg"), Net.HttpWebRequest).GetResponseAsync, Net.HttpWebResponse).GetResponseStream)
            Dim rq As Newtonsoft.Json.Linq.JToken = Newtonsoft.Json.Linq.JObject.Parse(json.ReadToEnd)
            Subs = $"{Convert.ToDecimal(rq.SelectToken("items")(0)("statistics")("subscriberCount")).ToString("#,###,###")}"
    
            Label1.Text = Subs
    
        Catch ex As Exception
    
            Timer1.Stop()
            MessageBox.Show("Erro ao tentar Conseguir os Dados do Canal!")
    
        End Try
    
    End Sub