ListBox.Items.Add aus anderem Thread aufrufen

05/03/2008 - 15:19 von Sebastian Schwaiger | Report spam
Grüß euch.

Folgendes:

Ich starte aus meinem MainForm heraus ein 2. Form mit eigener
Nachrichtenschleife und einer ListBox drauf (lstLog).


private class LogFormThread
{
public LogForm m_LogForm;

internal LogFormThread()
{
m_LogForm = new LogForm();
}

internal Thread InitLogFormThread()
{
Thread thread = new Thread(new ThreadStart(
delegate()
{
LogForm form = new LogForm();
Application.Run(form);
}));

return thread;
}
}

...

LogFormThread thread = new LogFormThread();
ctlSurface.Client.OnMessage += new
EventHandler<MessageEventArgs>(thread.m_LogForm.OnMessage);

m_LogFormThread = thread.InitLogFormThread();
m_LogFormThread.Start();


Ich registriere eine Funktion des 2.Forms als Eventhandler im 1.Form.
Wenn ich nun diesen aufrufe,d ann wird der Code auch ausgeführt:

public void LogForm::OnMessage(object sender, MessageEventArgs args)
{
lstLog.Items.Add(args.Message);
}

Wenn ich einen Breakpoint setze, dann ist lstLog.Items.Count z.B. 103.
Aber die Liste wird trotzdem als leer angezeigt.
Wie schaffe ich es, dass die Liste angezeigt wird und nicht nur "so"
existiert?

btw, in Form_Load, wenn ich da ein Element hinzufüge wird es angezeigt,
Items.Count ist hier noch 0.

Ich hab momentan echt keine Ahnung woran es liegt :-/

Ihr vielleicht?

Wasti
 

Lesen sie die antworten

#1 Frank Dzaebel
06/03/2008 - 07:26 | Warnen spam
Hallo Sebastian,

Ich starte aus meinem MainForm heraus ein 2. Form mit eigener
Nachrichtenschleife und einer ListBox drauf (lstLog). [-> new Thread]
Wenn ich nun diesen aufrufe, dann wird der Code auch ausgeführt:
public void LogForm::OnMessage(object sender, ...)
{ lstLog.Items.Add(args.Message); }



Beachte dazu:

[Bearbeiten von Steuerelementen aus Threads]
http://dzaebel.net/ControlInvoke.htm



Wenn ich einen Breakpoint setze, dann ist lstLog.Items.Count z.B. 103.
Aber die Liste wird trotzdem als leer angezeigt.



Alle managed Threads werden wàhrend eines
Breakpoints angehalten. Du muss ggf. erst in den
Thread wechseln, in dem lstLog erstellt wurde.
(Non-managed Threads, die keine Runtime-Referenzen
enthalten, werden übrigens nicht angehalten, laufen weiter!).

Es gàbe mehrere Möglichkeiten in den (ggf. eingefrorenen)
Kontext eines anderen Threads beim Debuggen zu wechseln:

[Exemplarische Vorgehensweise: Debuggen einer Multithreadanwendung]
http://msdn2.microsoft.com/de-de/li...57784.aspx

[Gewusst wie: Verwenden des Threadfensters]
http://msdn2.microsoft.com/de-de/li...yf86f.aspx


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen