Re: MultiThreaded App always reverts back to UI Thread
- From: Larry Lard <larrylard@xxxxxxxxxxxxxx>
- Date: Wed, 30 Aug 2006 12:19:16 +0100
greener.jay@xxxxxxxxx wrote:
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.
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)
{
MessageBox.Show(Thread.CurrentThread.Name); (This returns
"logFileInvoker")
readLogDelegate readlog = new readLogDelegate(dothework);
readlog.BeginInvoke(logFile, null, null);
}
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)
{
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);
}
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.
--
Larry Lard
larrylard@xxxxxxxxxxxxxx
The address is real, but unread - please reply to the group
For VB and C# questions - tell us which version
.
- References:
- MultiThreaded App always reverts back to UI Thread
- From: greener . jay
- MultiThreaded App always reverts back to UI Thread
- Prev by Date: Re: Size of Window and scroll bar
- Next by Date: Re: MultiThreaded App always reverts back to UI Thread
- Previous by thread: MultiThreaded App always reverts back to UI Thread
- Next by thread: ComboBox autocompletion and data binding problem (.NET 2.0)
- Index(es):
Relevant Pages
|