Ορίστε ένα ολοκληρωμένο παράδειγμα για ασύγχρονο fill του dataset (φτάνουν 4Μ εγγραφές
. Η διαφοροποίηση σε ότι είχαμε πει στο post που σου είχα προτείνει να διαβάσεις είναι ότι εδώ δεν υπάρχει η ανάγκη να κάνεις update τα controls της φόρμας κατά τη διάρκεια του long-running-operation ήτοι το fill του dataset, αλλά απλά να κάνεις bind το datagrid μόλις τελειώσει το fill. Πρόσεξε γιατί εδώ το
DataGrid1.CaptionText = ...
είναι παράνομο και πρέπει να γίνεται όπως έχουμε πει στο συγκεκριμένο post, απλά το χρησιμοποίησα για να μην επεκταθεί πολύ ο κώδικας.
Το μόνο που χρειάζεται είναι να κάνεις copy/paste τον κώδικα σε μια φορμούλα με ένα datagrid και δύο buttons, να έχεις sql server και τη northwind...
Dim fillerThread As Thread
Dim fillerThreadStart As New ThreadStart(AddressOf QueryDataBase)
Dim DataGridBinder As New MethodInvoker(AddressOf Me.BindDataGrid)
Dim cnNorthwind As New SqlConnection("data source=localhost;initial catalog=northwind;integrated security=SSPI;")
Dim daProducts As New SqlDataAdapter("SELECT Products.* FROM Orders CROSS JOIN Products CROSS JOIN Products Customers", cnNorthwind)
Dim dsNorthwind As New DataSet
Public Sub BindDataGrid()
DataGrid1.DataSource = dsNorthwind
DataGrid1.DataMember = "BigTable"
daProducts = Nothing
dsNorthwind = Nothing
End Sub
Public Sub QueryDataBase()
Try
cnNorthwind.Open()
DataGrid1.CaptionText = "Running query..."
daProducts.Fill(dsNorthwind, "BigTable")
DataGrid1.CaptionText = "Query complete."
Me.BeginInvoke(DataGridBinder)
Catch thEx As ThreadAbortException
Finally
cnNorthwind.Close()
cnNorthwind.Dispose()
cnNorthwind = Nothing
fillerThread = Nothing
End Try
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
fillerThread = New Thread(fillerThreadStart)
fillerThread.IsBackground = True
fillerThread.Name = "UpdateThread"
fillerThread.Start()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
fillerThread.Abort()
DataGrid1.CaptionText = "Query cancelled."
End Sub
Και καθώς έγραφα αυτό το post, τσουπ! Έρχεται το post του gcapnias…
gcapnias wrote: |
Μήπως στην συγκεκριμένη περίπτωση θα ήταν καλύτερα να δηλώσουμε ένα Delegate και να ξεκινήσουμε το Thread με BeginInvoke και να του περνάμε ένα dataset και να το παίρνουμε πίσω; Υπόθεση κάνουμε...
|
|
Όχι, δεν χρειάζεται να κάνει βόλτες το DataSet... Tο κόλπο είναι να χρησιμοποιήσεις δύο delegates, ένα το ThreadStart και ένα το MethodInvoker. Το πρώτο κάνει την δουλειά που θέλουμε και το δεύτερο ανανεώνει τη φόρμα γιατί όπως είπαμε "Το μυστικό είναι ότι το control χρησιμοποιεί το delegate για να καλέσει τη μέθοδο στο context του δικού του thread!"
Vir prudens non contra ventum mingit