1

Ich habe einen Hintergrundthread erstellt, der Daten abruft und sie an den Hauptthread zurückgibt; das funktioniert. Jetzt möchte ich in der Lage sein, die SQL-Anfrage vom Hauptthread zu stoppen (wahrscheinlich auf Knopfdruck).Zugriff auf einen laufenden Hintergrundthread VB.NET VS2008

Dies ist mein Test-Code für den Faden zu schaffen (in Betrieb):

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 

Wie kann ich den Hintergrund-Thread Zugriff auf die Abfrage auf Anfrage zu stoppen?

Muss ich eine Markierung auf dem Hauptthread setzen, die dem Hintergrundthread sagt, um zu laufen zu stoppen, dann muss der Hintergrundthread den Hauptthread in Abständen abfragen?

Jede Hilfe wäre willkommen. Ich habe versucht, nach einem Beispiel zu suchen, aber ich konnte keinen guten finden. Sogar Pseudocode würde helfen

Danke.

Antwort

0

Die DataAdapter.Fill-Methode ist synchron, dh sie blockiert den aktuellen Thread bis zum Abschluss. Das bedeutet im Grunde genommen, dass Sie keine Polling/Checking-Funktion im Hintergrundthread hinzufügen können, da alles, was es tun kann, das Ausführen der Fill-Methode ist (was zeitraubend sein kann).

Wenn Ihr Problem den Vorgang selbst beendet (bitte beachten Sie, dass keine Daten zurückgegeben werden können), sollten Sie thread.Abort() nur aus Ihrem Hauptthread aufrufen. Dazu müssten Sie thrGetData als Variable auf Klassenebene speichern. Mehr über Thread.Abort() kann here gefunden werden.

+0

Wird das Töten des Threads zu einem unerwünschten Ergebnis führen? Ich habe darüber nachgedacht, dies zu versuchen, aber ich war besorgt darüber, was auf dem SQL Server Ende der Dinge passiert. Wird der Prozess auch auf dem SQL Server beendet? Ich habe diesen [Artikel] (http://sqlblog.com/blogs/linchi_shea/archive/2010/02/04/killing-a-sql-server-thread-don-t.aspx) über das Töten von Prozessen auf SQL Server gelesen kann zu unerwünschten Ergebnissen führen. Würde dies ein ähnliches Problem verursachen? – Eric

+0

Der Artikel befasst sich mit SQL Server-Threads - sie zu töten ist schädlich. Das Töten Ihres Anwendungsthreads wird Ihrem SQL-Server keinen Schaden zufügen. Schlimmste könnte passieren - SQL-Verbindung wird verloren gehen - die wird sowieso irgendwann. Es hat keine Möglichkeit, SQL Server-Prozess zu töten, da es unabhängig ist. –