1

のデータを取得してメインスレッドに返すバックグラウンドスレッドを作成しました。これは機能します。ここで、メインスレッドからのSQL要求を停止できるようにしたいと思います(おそらくボタンをクリックしたとき)。

これは、スレッドを作成するための私のテストコードです(動作中):

Private Sub GetSql()
    If (Me.InvokeRequired) Then
        Me.Invoke(New GetSqlDelegate(AddressOf GetSql))
    Else
        Dim da As SqlDataAdapter = New SqlDataAdapter("select * from database", _
            New SqlConnection(connectionString))
        dt = New DataTable
        da.Fill(dt)
        Me.BeginInvoke(New BindDataToGridDelegate(AddressOf BindDataToGrid))
    End If
End Sub

Private Delegate Sub BindDataToGridDelegate()
Private Sub BindDataToGrid()
    DataGridView1.DataSource = dt
    dt = Nothing
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    thrGetData = New Thread(AddressOf ThreadBackgroundData)
    thrGetData.IsBackground = True
    thrGetData.Start()
End Sub

バックグラウンドスレッドにアクセスして、オンデマンドでクエリを停止するにはどうすればよいですか?

メインスレッドにフラグを設定して、バックグラウンドスレッドに実行を停止するように指示し、バックグラウンドスレッドに定期的にメインスレッドをポーリングさせる必要がありますか?

どんな助けでもいただければ幸いです。例を探していましたが、良い例が見つかりませんでした。擬似コードでさえ役立つでしょう

ありがとう。

4

1 に答える 1

0

DataAdapter.Fillメソッドは同期的です。つまり、完了するまで現在のスレッドをブロックします。基本的に、これは、バックグラウンドスレッドでポーリング/チェックを追加できないことを意味します。これは、実行できるのはFillメソッドの実行だけであるためです(これには時間がかかる場合があります)。

問題が操作自体の停止である場合(データが返されない場合があることに注意してください)、メインスレッドからthread.Abort()を呼び出すだけです。そのためには、thrGetDataをクラスレベルの変数として保存する必要があります。Thread.Abort()の詳細については、こちらをご覧ください

于 2012-03-23T21:33:08.750 に答える