2

ストアド プロシージャの実行中にフォームがハングしないようにするための方法を教えてください。添付のコードを参照してください。Stream API を介して Twitter からデータを収集していますが、sproc の実行中にフォームがハングします。フォームがハングしないようにするには、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
4

1 に答える 1

0

メイン スレッドでコードを実行しているため、フォームがハングします。メイン スレッドは、マウス クリックへの応答、出力の表示、および入力を取得するためのループを担当します。しかし、メイン スレッドを他の何かにふけると、コードの実行中にすべてのタスクを実行できなくなり、フォームが動かなくなったように見えます。より大きなタスクには別のスレッドを作成する必要があります。System.Threading クラスのスレッド プールまたはその他のプロシージャを使用する必要があります。Private Sub のようなサブを作成し、何か名前を付けて、多忙なコードをすべて入れ、サブを End Sub で終了します。次に、スレッド変数を作成し、その Sub にアドレス指定します。Dim variable As New System.Threading.Thread(AddressOf yoursubnamehere). 次に、優先度などのプロパティを設定しますthreadvariable.Start()。問題は解決しました:)より便利な場合は、backgroundworkerも使用できます。

于 2013-12-25T22:37:37.777 に答える