Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsFree MagazinesWhite PapersSubmit Content
Discussion GroupsASP.NETWindows FormsLanguages.NET FrameworkVisual Studio.NET
Articles.NET FrameworkASP.NETToolsWindows Forms
.NET DirectoryOpen Source ProjectsUser GroupsWeb Resources
Related Topics
Visual Basic 6SQL ServerMS AccessOther DB ProductsMS Server ProductsMore Topics ...

.NET Forum / Windows Forms / WinForm General / August 2006

Tip: Looking for answers? Try searching our database.

MultiThreaded App always reverts back to UI Thread

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
greener.jay@gmail.com - 29 Aug 2006 16:49 GMT
I'm a C# newb and am trying to write a multithreaded app to free up my
UI thread so that it can repaint the screen etc.  The application does
spawn another thread (I've verified this with Performance Monitor and
by naming the different threads I am working with), which spawns
another thread that in turn issues the invoke statement.  This results
in the program reverting back to the original thread and my UI freezes
until the work is completed.  I think I have added additional steps for
nothing and I am obviously not understanding something about the
concept of the worker thread.  Here is a snippet of my code.

public Form1()
           {
           InitializeComponent();
           Thread.CurrentThread.Name = "Main Thread";

          MessageBox.Show(Thread.CurrentThread.Name); (This returns
"Main
Thread")
          logFile = Path.Combine(@servername.Trim(), @"path to
logfile");
          Thread invoker = new Thread(logFileInvoker);
          invoker.Name = "Log File Invoker Thread";
          invoker.Start();

       public void logFileInvoker()
       {

           MessageBox.Show(Thread.CurrentThread.Name); (This returns
"logFileInvoker")
           readLogFile(logFile);
       }

       delegate void readLogDelegate(string parameter);
       private void readLogFile(string logFile)
       {

           MessageBox.Show(Thread.CurrentThread.Name); (This returns
"logFileInvoker")
           readLogDelegate readlog = new readLogDelegate(dothework);
           readlog.BeginInvoke(logFile, null, null);

       }

       private void dothework(string logFile)
       {
           MessageBox.Show(Thread.CurrentThread.Name); (The first time
through this returns empty because I never set this new thread name,
the second time through it is back to my inital "Main Thread")

           if (this.listView1.InvokeRequired) (This returns True the
first time through but not the second)
           {

              this.Invoke(new readLogDelegate(dothework), new object[]
{ logFile });

           }

           else
           {
               ListView ListView1 = new ListView();
               listView1.Clear();
               listView1.View = View.Details;
               listView1.Columns.Add("", -1,
HorizontalAlignment.Left);
               listView1.Columns.Add("", 10000,
HorizontalAlignment.Left);

             }
Larry Lard - 30 Aug 2006 12:19 GMT
> I'm a C# newb and am trying to write a multithreaded app to free up my
> UI thread so that it can repaint the screen etc.  The application does
[quoted text clipped - 5 lines]
> nothing and I am obviously not understanding something about the
> concept of the worker thread.  Here is a snippet of my code.

Not really enough for me to say categorically what the problem is, but
if we look here:

[all fine so far - we have created a new thread to run this method]
>         delegate void readLogDelegate(string parameter);
>         private void readLogFile(string logFile)
[quoted text clipped - 6 lines]
>
>         }

So dothework will be run on the new thread, which is correct, because
this is the worker thread, and we want to do the work :)

>         private void dothework(string logFile)
>         {
>             MessageBox.Show(Thread.CurrentThread.Name); (The first time
> through this returns empty because I never set this new thread name,
> the second time through it is back to my inital "Main Thread")

>             if (this.listView1.InvokeRequired) (This returns True the
> first time through but not the second)
[quoted text clipped - 16 lines]
>
>               }

OK let's hold it right here. Why is the *worker* thread going to the UI
at this time? The code suggested to me that the 'work' was going to
involve reading a log file, but there isn't any of that here. You have
the concept of going to the UI thread with InvokeRequired and Invoke
when you want to update the UI, but that isn't what you should be doing
here - you should be doing 'the work' of reading the log file, and *when
that is done* (or when you have useful intermediate results), you can go
to the UI.

Have a method which takes actual results (the readings from the log
file, I suppose) and puts them in the UI. Put appropriate InvokeRequired
checks to make sure it only runs on the UI thread. Then call this method
from dothework when you actually have results.

Signature

Larry Lard
larrylard@googlemail.com
The address is real, but unread - please reply to the group
For VB and C# questions - tell us which version


Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.