?
Solved

Threading in .net

Posted on 2009-04-14
7
Medium Priority
?
239 Views
Last Modified: 2013-11-08
we are making an application which requires fetch from the database using a webservice. Until the fetch completes the application hangs. We incoroporated threads into the application both plain threads and background threads but none of them are able to bring the application out of the hang until the fetch completes. What could be wrong with our approach? we want a separate thread doing a fetch and doesnot effect the rest of the application!
0
Comment
Question by:sultansaadat
[X]
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
  • 4
  • 2
7 Comments
 
LVL 75

Expert Comment

by:käµfm³d 👽
ID: 24141053
Could you possibly post some code dealing with where you are creating the thread and where you are making the threaded call to the webservice?
0
 

Author Comment

by:sultansaadat
ID: 24141179
here goes the code. This one has a simple call to an online database.
 ClassDAL cdl = new ClassDAL();
 DataSet ds = new DataSet();
 void testThread()
        {
            
            
             if (InvokeRequired)
            {
                   
                MethodInvoker method = new MethodInvoker(testThread);
                Invoke(method);
                return;
            }
 
           
            ClassDAL cdl = new ClassDAL();
            //DataSet ds = new DataSet();
            ds = cdl.getAllProducts();
 
        
           
        }
 
 private void button1_Click(object sender, EventArgs e)
        {
         
            this.backgroundWorker1.RunWorkerAsync();
            
            
            
        }
 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
 
            testThread();
            //System.Threading.Thread.Sleep(500);
           
        }
 
        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            dataGridView1.DataSource = ds;
            dataGridView1.DataMember = ds.Tables[0].TableName;
        }

Open in new window

0
 

Author Comment

by:sultansaadat
ID: 24141197
our thread is not running asynchronously!
0
Free learning courses: Active Directory Deep Dive

Get a firm grasp on your IT environment when you learn Active Directory best practices with Veeam! Watch all, or choose any amount, of this three-part webinar series to improve your skills. From the basics to virtualization and backup, we got you covered.

 
LVL 6

Expert Comment

by:obrienslalom
ID: 24141968
Take a look at the documentation for the ISychronizeInvoke interface:
http://msdn.microsoft.com/en-us/library/system.componentmodel.isynchronizeinvoke_methods.aspx.
What happens with Invoke is that is basically just a call to BeginInvoke followed by a call to EndInvoke.  Invoke will be a synchronous call.
0
 

Author Comment

by:sultansaadat
ID: 24141991
Thanks. I will try the code now! :)
0
 

Author Comment

by:sultansaadat
ID: 24142027
basically we wont have to create other threads?
0
 
LVL 6

Accepted Solution

by:
obrienslalom earned 2000 total points
ID: 24144223
I am not going to say that you don't need another thread.  That is what the BackGroundWorker will do for you.  What you are running into in your case is a bit odd actually.  A little background might be needed.

Imagine you have a single GUI thread, which creates a bunch of controls. Now you spawn off another thread to perform some work. This new thread shouldn't be able to update the controls created and owned by the GUI thread.

Invoke/BeginInvoke transfers the tasks onto the GUI threads. That is why you are seeing an unresponsive interface.  You are spawning a background worker, which just transfers the work right back to the original thread.

So, basically, you don't need to use Invoke unless you are updating the controls on the GUI.  So do as much work as you can first, then use Invoke when you have to (which will be any cross-thread updates).
0

Featured Post

NFR key for Veeam Agent for Linux

Veeam is happy to provide a free NFR license for one year.  It allows for the non‑production use and valid for five workstations and two servers. Veeam Agent for Linux is a simple backup tool for your Linux installations, both on‑premises and in the public cloud.

Question has a verified solution.

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

Here I am going to explain creating proxies at runtime for WCF Service. So basically we use to generate proxies using Add Service Reference and then giving the Url of the WCF service then generate proxy files at client side. Ok, what if something ge…
This article aims to explain the working of CircularLogArchiver. This tool was designed to solve the buildup of log file in cases where systems do not support circular logging or where circular logging is not enabled
NetCrunch network monitor is a highly extensive platform for network monitoring and alert generation. In this video you'll see a live demo of NetCrunch with most notable features explained in a walk-through manner. You'll also get to know the philos…
Have you created a query with information for a calendar? ... and then, abra-cadabra, the calendar is done?! I am going to show you how to make that happen. Visualize your data!  ... really see it To use the code to create a calendar from a q…
Suggested Courses

764 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