避免表单挂起在vb.net中

避免表单挂起在vb.net中,vb.net,Vb.net,我想知道您建议使用什么方法来避免在执行存储过程时窗体挂起。见我的附加代码。我通过流API从Twitter收集数据,执行存储过程时表单挂起。 使用BackgroundWorker是避免表单挂起的最佳方法吗?你能给我一个例子如何在我的代码中实现这一点吗 Imports System.Linq Imports System.Text Imports System.Net Imports System.IO Imports Newtonsoft.Json.Linq Imports Newtonsoft.

我想知道您建议使用什么方法来避免在执行存储过程时窗体挂起。见我的附加代码。我通过流API从Twitter收集数据,执行存储过程时表单挂起。 使用BackgroundWorker是避免表单挂起的最佳方法吗?你能给我一个例子如何在我的代码中实现这一点吗

Imports System.Linq
Imports System.Text
Imports System.Net
Imports System.IO
Imports Newtonsoft.Json.Linq
Imports Newtonsoft.Json
Imports System.Data.SqlClient
Imports System.Threading

Public Class Form1

    Private Sub btnDB_Click(sender As System.Object, e As System.EventArgs) Handles btnDB.Click
        Dim url As String = "https://stream.twitter.com/1.1/statuses/filter.json?track=twitter"
        Dim request As WebRequest = WebRequest.Create(url)
        request.Credentials = New NetworkCredential("username", "pwd")
        Dim WebResponse = request.GetResponse()
        Dim encode As Encoding = Encoding.GetEncoding("utf-8")
        Dim responseStrem = New StreamReader(WebResponse.GetResponseStream(), encode)




        While Not responseStrem.EndOfStream
            'Console.WriteLine(responseStrem.ReadLine());

            Dim json As String = responseStrem.ReadLine()
            If json.Length <> 0 Then
                ParseJson(json)
            End If
        End While
    End Sub

    Private Sub ParseJson(ByVal Json As String)

        Dim connectionstring As String = "Data Source=.;Initial Catalog=db_twitter_stream;User ID=sa;Password=xxx"
        Dim counter As Integer = 0
        Dim conn As New SqlConnection(connectionstring)
        conn.Open()
        Dim o As JObject = JObject.Parse(json)

        Dim tweet As String = o("text")
        Dim source As String = o("source")
        Dim created_at As String = o("created_at")

        Dim cmd As New SqlCommand("dbo.prc_tweets", conn)
        cmd.CommandType = System.Data.CommandType.StoredProcedure
        cmd.Parameters.Add(New SqlParameter("@tweet", tweet))
        cmd.Parameters.Add(New SqlParameter("@source", source))
        cmd.Parameters.Add(New SqlParameter("@created_at", created_at))

        cmd.ExecuteNonQuery()

        counter = counter + 1
        lblCount.Text = counter.ToString()



        conn.Close()

    End Sub

    Private Sub btnQuit_Click(sender As System.Object, e As System.EventArgs) Handles btnQuit.Click
        Me.Close()
    End Sub



End Class
导入系统.Linq
导入系统文本
导入系统.Net
导入System.IO
导入Newtonsoft.Json.Linq
导入Newtonsoft.Json
导入System.Data.SqlClient
导入系统线程
公开课表格1
私有子btnDB_Click(发件人作为System.Object,e作为System.EventArgs)处理btnDB。单击
将url设置为字符串=”https://stream.twitter.com/1.1/statuses/filter.json?track=twitter"
Dim请求作为WebRequest=WebRequest.Create(url)
request.Credentials=新的网络凭据(“用户名”、“密码”)
Dim WebResponse=request.GetResponse()
Dim encode As Encoding=Encoding.GetEncoding(“utf-8”)
Dim ResponseStream=新的StreamReader(WebResponse.GetResponseStream(),encode)
而不是响应。EndOfStream
'Console.WriteLine(responseStrem.ReadLine());
Dim json As String=responseStrem.ReadLine()
如果json.Length为0,则
ParseJson(json)
如果结束
结束时
端接头
私有子ParseJson(ByVal Json作为字符串)
Dim connectionstring As String=“数据源=;初始目录=db\u twitter\u流;用户ID=sa;密码=xxx”
作为整数的Dim计数器=0
Dim conn作为新的SqlConnection(connectionstring)
康涅狄格州公开赛
Dim o As JObject=JObject.Parse(json)
将tweet设置为字符串=o(“文本”)
将源变暗为字符串=o(“源”)
Dim created_at As String=o(“created_at”)
Dim cmd作为新的SqlCommand(“dbo.prc_tweets”,康涅狄格州)
cmd.CommandType=System.Data.CommandType.StoredProcess
cmd.Parameters.Add(新的SqlParameter(“@tweet”,tweet))
cmd.Parameters.Add(新的SqlParameter(“@source”,source))
cmd.Parameters.Add(新的SqlParameter(“@created_at”,created_at))
cmd.ExecuteNonQuery()
计数器=计数器+1
lblCount.Text=counter.ToString()
康涅狄格州关闭
端接头
私有子btnQuit_Click(发送方作为System.Object,e作为System.EventArgs)处理btnQuit。单击
我
端接头
末级

表单挂起,因为您正在主线程中运行代码。主线程负责对鼠标单击做出响应,显示输出并循环获取输入。但是,一旦你让主线程沉迷于其他事情,它就不能再在执行代码时运行所有任务,这使它看起来像是你的表单被卡住了。您需要为更大的任务创建另一个线程。您需要使用System.Threading类中的线程池或多个过程。创建一个类似于Private sub的sub,给它起个名字,把你所有的忙代码放进去,用end sub结束sub。然后创建一个thread变量,并将它作为新的System.Threading.thread(AddressOf yoursubnamehere)的Dim变量发送到该sub。然后设置其属性,如优先级等。然后
threadvariable.Start()
。问题已解决:) 如果您更方便的话,也可以使用backgroundworker。

请参阅: