MultiThreaded App always reverts back to UI Thread

G

greener.jay

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 which turns control . However, when I issue the invoke
statement it reverts 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 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);


}
 
P

Patrice

"dothework" is badly named ? This is what updates the UI so you use invoke
so that the UI update is done by the UI thread. So you are back to the UI
thread. Isn't it what you wanted ?

I'm not sure where the actual work lies in this code snippet...

Also it looks like you have an extra level of delegate calls that I'm not
sure is usefull...

You could also try the BackGroundWorker component that already take care of
calling each event on the appropriate thread for you (the event that does
the work is called on the worker thread and the update progress event is
called on the UI thread).

Also double check that multithreading is actually a win in you particular
case (AFAIK an UI that is very frequently updated by the worker thread is
not a win as the UI thread uses anyway most of its time to respond to worker
thread calls rather than to user interaction).

--
Patrice

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 which turns control . However, when I issue the invoke
statement it reverts 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 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);


}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top