Search code examples
vb.netwebclient

The GUI is not moving properly


I'm doing a little widget that shows the price of bitcoin using Binance API here

I'm not using Json format as I Just need to parse one string, eventhough I know many of you will say to use json. Anyway, I want to keep the software as simple as possible, but there is a little problem. I'm downloading the source with webclient and Updating it using a timer. I think I'm doing a mistake creating every time the new webclient because when I want to move the form, Is not properly mooving even if its not freezing. The code I'm using is:

Private Sub webclientbtc()
       Dim wc As New Net.WebClient
       Dim WBTC As IO.Stream = Nothing
       wc.Encoding = Encoding.UTF8
       WBTC = wc.OpenRead("https://api.binance.com/api/v1/ticker/24hr?symbol=BTCEUR")
       Dim btc As String
       Using rd As New IO.StreamReader(WBTC)
           btc = rd.ReadToEnd
       End Using
       '---------BTC PRICE---------'
       Dim textBefore As String = """lastPrice"":"""
           Dim textAfter As String = ""","
           Dim startPosition As Integer = btc.IndexOf(textBefore)
           startPosition += textBefore.Length
           Dim endPosition As Integer = btc.IndexOf(textAfter, startPosition)
       Dim textFound As String = btc.Substring(startPosition, endPosition - startPosition)
       Dim dNumber As Double = Val(textFound.ToString)
       Label1.Text = dNumber.ToString("n2")
       '-------------------------------------'
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
       webclientbtc()
   End Sub

Timer interval is on 1000 ms, which is great to keep me update. Any idea on how I can avoid the creations of new webclient at every update? Thanks


Solution

  • Simplified, and using TAP:

    Private wc as New WebClient()
    
    Private Async Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Dim s = Await wc.DownloadStringTaskAsync("https://api.binance.com/api/v1/ticker/24hr?symbol=BTCEUR")
        Dim d = JsonConvert.DeserializeObject(Of Dictionary(Of String, String))(s)
        Label1.Text = d("lastPrice")
    End Sub
    

    You need to reference newtonsoft json package and imports it, as well as imports system.collections.generic