【问题标题】:How to prevent lag in form while moving?移动时如何防止形式滞后?
【发布时间】:2018-05-31 16:18:22
【问题描述】:

当左右移动表单时,每 5 秒检查一次来自网站的 JSON 请求(使用计时器)时会出现小延迟,有什么办法可以防止这个问题吗?

示例图片

这是代码

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

【问题讨论】:

  • 你试过异步运行请求吗?
  • 不,我不知道你是怎么做到的。
  • 使用 BackgroundWorker 或 Task 防止代码干扰 UI 线程。
  • 但是我该如何调用这段代码呢?不是函数,不知道怎么弄。

标签: vb.net forms animation lag ui-thread


【解决方案1】:

使用Asynchronous 操作可能会解决您的问题

我无法正确测试代码,但如下所示,将sub 更改为Async Sub 并将GetResponse 更改为GetResponseAsync 添加await keword 应该可以做到。

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

【讨论】:

  • 抱歉,await task.run 不应该在那里
猜你喜欢
  • 1970-01-01
  • 2013-06-20
  • 1970-01-01
  • 2020-12-25
  • 2019-10-04
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 2015-02-17
相关资源
最近更新 更多