| 

.NET C# Java Javascript Exception

3
C#, .NET4, WPF

Hallo,
ich habe ein Meßgerät. Das wird entweder "direkt" über das UI bedient, oder über eine Schnittstelle von "aussen". Für die Fernsteuerung habe ich ein WPF - Dialog, der (die z. B. serielle) Kommunikation übernimmt und mit der Hauptanwendung per Events kommunizieren soll.

Mein Problem: Damit sich Meßgerät und Fernsteuerung nicht gegenseitig blockieren möchte ich die Fernsteuerung in einem eigenen Thread starten. Verkürzt sieht das ganze in etwa so aus:

Window m_RemoteDialog;
ThreadStart m_ThreadStart;
Thread m_RemoteControlThread;

private void buttonStartRemoteControl_Click(object sender, RoutedEventArgs e)
{
m_ThreadStart = new ThreadStart(StartRemoteControl);
m_RemoteControlThread = new Thread(m_ThreadStart);
m_RemoteControlThread.SetApartmentState(ApartmentState.STA);
m_RemoteControlThread.Start();
m_RemoteControlThread.Join();
}

private void StartRemoteControl()
{
m_RemoteDialog = new RemoteDialog();
m_RemoteDialog.Show();
}


Dann flackert mein FernsteuerDialog kurz auf und dann sehe ich im Debugger nur noch:
"m_RemoteControlThread.ApartmentState" hat eine Ausnahme vom Typ "System.Threading.ThreadStateException" verursacht.


Ohne Threading kann ich das Fenster für die Fernsteuerung normal öffnen und die Kommunikation läuft auch, aber eben alles in einem Kontext.

Danke,
Mike
News:
23.05.2011
Xantiva 2,3k 2 9
1
Wenn ich den WPF - Dialog mit .ShowDialog() aufrufe und nicht auf das Ende warte, also .Join() entferne, bleibt mein Fenster offen ...
Das war es dann erst mal.
Xantiva 23.05.2011
1 Antwort
2
Hallo,

tut mir leid schreiben zu müssen, aber das ist ein ganz falscher Ansatz. Vermische nicht die UI mit der Logik, sondern trenne diese. Für WPF bietet sich hierzu zB MVVM an. Vom ViewModel aus kannst du dann auch die anderen Daten asynchron bzw. mit einem anderen Thread holen.

Da alle UI-Elemente im Main-Thread laufen sollten (bis auf wenige Ausnahmen) ist es sowieso nicht sinnvoll einen neuen Thread zu erzeugen. Mehr dazu steht in Threading Model.

Schau dir beide Links mal an und überdenke den Entwurf deiner Anwendung.

mfG Gü
23.05.2011
gfoidl 9,4k 3 5
Danke für den Hinweis, aber ... ;)

Diese "RemoteControl" wird eine eigenständige, eventbasierte Komponente, die in mehreren Applikationen verwendet werden soll. Die Kommunikation erfolgt ausschließlich über 3-4 Events. Und Hauptanforderung: Egal was in der Hauptanwendung gerade passiert, die Kommunikation muss schnell antworten können.

Aber ich werde mir auf jeden Fall die Inhalte der Links nochmal durchlesen. Für den Rest kommt MVVM durchaus zum tragen.
Xantiva 24.05.2011

Stelle deine .net-Frage jetzt!