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