2013-02-28 4 views
2

저장 프로 시저를 실행하는 동안 내 양식이 멈추지 않도록하려면 어떤 방법을 제안하고 싶습니다. 첨부 된 코드를 참조하십시오. 스트림 API를 통해 Twitter에서 데이터를 수집하고 sproc을 실행하는 동안 양식이 중단됩니다. 폼이 멈추지 않도록하려면 BackgroundWorker를 사용하는 것이 가장 좋습니다. 이 코드가 어떻게 구현되는지 예제를 통해 알려주시겠습니까?vb.net에서 응답하지 않는 양식 피하기

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 
+0

참조 : http://stackoverflow.com/questions/10398490/how-to-make-a-very-simple-asynchronous-method-call-in-vb-net –

답변

0

주 스레드 코드를 실행하기 때문에 양식이 중단됩니다. 주 스레드는 마우스 클릭에 대한 응답을 제공하고 출력을 표시하며 입력을 위해 루프를 수행합니다. 하지만 일단 메인 스레드가 다른 것에 빠지면 코드를 실행하는 동안 더 이상 모든 작업을 실행할 수 없으므로 양식이 멈추는 것처럼 보입니다. 더 큰 작업을 위해 다른 스레드를 만들어야합니다. 스레드 풀 또는 System.Threading 클래스의 더 많은 프로 시저를 사용해야합니다. Private Sub와 같은 서브를 만들고 뭔가 이름을 지어서 바쁜 코드를 넣고 End Sub로 서브를 끝내십시오. 그리고 스레드 변수를 만들고 그 Sub에 주소를 지정하십시오. Dim variable As New System.Threading.Thread(AddressOf yoursubnamehere). 그런 다음 우선 순위 등의 속성을 설정하십시오. threadvariable.Start(). 문제가 해결되었습니다. 더 편리 할 경우 배경 작업자도 사용할 수 있습니다.

관련 문제