Hallo.
Ich stehe noch relativ weit am Anfang mit C#. Ich war vorher eher nur im Skripting-Bereich wie AutoIt unterwegs. Irgendwann waren die Möglichkeiten der Skriptsprachen leider erschöpft. Deshalb auch der Wechsel zu einer höheren Sprache.
In meinem kleinen Projekt nutzte
Cassia.dll, um Sitzungsinformationen auf einem RDSH abzufragen und mir diese in grafischen Oberfläche anzeigen zu lassen. Dieses funktioniert auch schon recht zuverlässig. Wie ich es auch AutoIt kenne, friert die Benutzeroberfläche natürlich ein. Deshalb habe ich versucht, die Abfrage in einen separaten Ausführungsstrang auszulagern. Leider nur mit mäßigem Erfolg. Das Kombinationsfeld, in dem ich meine RDSHs gespeichert, bleibt jetzt nicht mehr offen und klappt ein. Aber die Oberfläche friert immer noch ein. Auch das Beschriftungsfeld, in dem der Benutzer informiert wird, dass gerade etwas passiert, wird nicht aktualisiert.
Es wäre schön, wenn Ihr mich hier in die richtige Richtung schubsen könntet.
Danke im Voraus.
Auszug aus der Klasse RemoteSession
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45:
| public static List<SessionInfo> QueryRemoteSessions(string remoteHost) { List<SessionInfo> sessionInfos = new List<SessionInfo>();
ITerminalServicesManager manager = new TerminalServicesManager(); ITerminalServer server = manager.GetRemoteServer(remoteHost); server.Open();
if (server.IsOpen) { foreach (ITerminalServicesSession session in server.GetSessions()) {
if (session.ConnectionState == ConnectionState.Active) { SessionInfo sessionInfo = new SessionInfo(session.SessionId, session.UserName, session.LoginTime.ToString(), session.ClientName, session.ClientIPAddress.ToString(), session.ConnectionState.ToString());
sessionInfos.Add(sessionInfo); } } }
server.Close(); sessionInfos.Sort();
return sessionInfos; } |
Nun der Quelltext in meiner WPF-Oberfläche
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| private void RDSHList_SelectionChanged(object sender, SelectionChangedEventArgs e) { Ping.IsEnabled = true; RefreshButton.IsEnabled = true;
string remoteHost = RDSHList.SelectedItem.ToString(); Infolabel.Visibility = Visibility.Visible; Infolabel.Content = String.Format("Sitzungsinformationen von {0} werden abgefragt.\nBitte warten ...", remoteHost); System.Threading.Thread myThread = new System.Threading.Thread(ThreadDoWork); myThread.Start(); Infolabel.Content = String.Empty; Infolabel.Visibility = Visibility.Hidden; }
#region --- Threading Test public delegate void myListviewDisplayDel(); private object myLock = new object();
private void myListviewDisplay() { string remoteHost = RDSHList.SelectedItem.ToString(); List<SessionInfo> sesionInfos = RemoteSession.QueryRemoteSessions(remoteHost); listview.ItemsSource = sesionInfos; } private void ThreadDoWork() { lock (myLock) { if (!Dispatcher.CheckAccess()) { Dispatcher.Invoke(new myListviewDisplayDel(myListviewDisplay)); } } } #endregion --- Threading Test |