Convert code to use threading

Posted on 2008-06-13
Medium Priority
Last Modified: 2012-05-05
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 ....
          ... 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
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.

Question by:clintnash
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
LVL 11

Accepted Solution

AkisC earned 2000 total points
ID: 21785870
If you want to load something in the backgound use background worker
Just drag-drop a backgroundworker control on your form
doubleclick on it
You have the sub
Private Sub backgroundworker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles backgroundworker1.DoWork
///put your long to load code here///

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

    Private Sub backgroundworker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles backgroundworker1.RunWorkerCompleted
       ///it comes here when bachground work is finished////
    End Sub

Author Closing Comment

ID: 31467674
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,


Featured Post


Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction As chip makers focus on adding processor cores over increasing clock speed, developers need to utilize the features of modern CPUs.  One of the ways we can do this is by implementing parallel algorithms in our software.   One recent…
Parsing a CSV file is a task that we are confronted with regularly, and although there are a vast number of means to do this, as a newbie, the field can be confusing and the tools can seem complex. A simple solution to parsing a customized CSV fi…
Michael from AdRem Software explains how to view the most utilized and worst performing nodes in your network, by accessing the Top Charts view in NetCrunch network monitor (https://www.adremsoft.com/). Top Charts is a view in which you can set seve…
Visualize your data even better in Access queries. Given a date and a value, this lesson shows how to compare that value with the previous value, calculate the difference, and display a circle if the value is the same, an up triangle if it increased…
Suggested Courses
Course of the Month10 days, 19 hours left to enroll

770 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question