Link to home
Start Free TrialLog in
Avatar of clintnash
clintnashFlag for United States of America

asked on

Convert code to use threading

I have a winform app that loads a large quantity of data into a datagrid at start, the apps responsiveness once the data is loaded is good, but after the uses logs in the app looks like it has hung, the login box becomes and empty white square and the main form doesnt load for up to a minute and an half while the dataset that feeds the datagrid is being loaded.  After a little research I think the best method to resolve this is to put the sub that fills the dataset an binds to the datagrid into its own thread (at this point if someone has a better approach please let me know).  With that said, I started trying to find a few examples that explained threading in a way I could implement into my code. What I found were a number of simple examples that left me confused (this makes absolutely no sense to me at all).  

This is roughly the code in my main form.

Private Sub Form1_Load(ByVal sender ....
          Get_Data()
          ... do other stuff
End Sub

Private Sub Get_Data()
      Dim strConn As String = CType(ConfigurationSettings.AppSettings("connectionString"), String)
      Dim ds As DataSet
      Dim distinctds As DataSet

      ds = SqlHelper.ExecuteDataset(strConn, "sp_camps_reg_players", Integer.Parse(lblActiveSeason.Text))

      Dim dt As DataTable
      Dim dt1 As DataTable
      dt = ds.Tables.Item(0)

      'DistinctList is creating by another sub that takes a datatable
      'and returns a dataset that has the duplicates removed from it
      distinctds = DistinctList(dt, "playerid")

      dt1 = distinctds.Tables.Item(0)
      dv = New DataView(dt1)
      DataGrid1.AutoGenerateColumns = False
      DataGrid1.DataSource = dv
      txtfilter.Focus()
End Sub

I am not sure if it matter but the above sub does call another sub (called DistinctList).  Any advice on how to approach this problem will be greatly appreciated.

Thanks,
Clint...
ASKER CERTIFIED SOLUTION
Avatar of AkisC
AkisC
Flag of Greece image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of clintnash

ASKER

Thanks for the reply. I hit one small snag when I tried to implement it so I thought I would share this for others.  When I tried to implement  it as shown it generated an error, "Cross-thread operation no valid: Control Datagrid1 accessed from a thread other than the thread it was created on".  After a little research I changed the code the following and it works perfectly.  I changed the GetData sub to a function so it would return the datatable and used the following...

Private Function GetData()

        Dim strConn As String = CType(ConfigurationSettings.AppSettings("connectionString"), String)

      .. other code

        dv = New DataView(dt1)

        Return dv

End Function

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

        e.Result = GetData()

End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted

        Dim returnedData As DataView = TryCast(e.Result, DataView)

        DataGrid1.AutoGenerateColumns = False
        DataGrid1.DataSource = returnedData

        lblLoading.Text = "Data loaded successfully"
End Sub


Thanks again for your help,
Clint