/* Funzione che tenta di instaurare la connessione. Riavvia l'interfaccia di connessione se la connessione fallisce. * In caso di connessione riuscita, crea la Window principale (MainWindow) se non già esistente * Se già esistente invece, perchè già si è collegati ad un altro server, crea un nuovo tab */ private void ConnectionRequest(IAsyncResult result) { ClientProperties properties = result.AsyncState as ClientProperties; // Nel caso in cui la connessione fallisce if ((properties == null) || (!properties.client.Connected)) { MessageBox.Show("Connessione fallita"); this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(() => { // Abilitazione dei vari componenti dell'interfaccia ConnectButton.IsEnabled = true; txtAddress1.IsEnabled = true; txtPort.IsEnabled = true; IPaddressesBox.IsEnabled = true; this.Cursor = Cursors.Arrow; })); return; } NetworkStream stream = properties.client.GetStream(); // Imposto il tempo in cui il client si mette in attesa di ricevere dati stream.ReadTimeout = 5000; // Se la connessione ha avuto successo, bisogna verificare se esiste già una MainWindow // - Se esiste, significa che non bisogna crearne una nuova, ma bisogna solo aggiungere un tab // - Se non esiste, significa che bisogna crearne una nuova //il dispatcher è un oggetto associato alla UIThread ed è condiviso tra più thread. //un thread secondario non può aggiornare la grafica percui deve inserire nel dispatcher //un metodo per farlo. Questo metodo inserito nel dispatcher verrà eseguito dallo UIthread. //BeginInvoke fa eseguire tale metodo in maniera asincrona a differenza di invoke che è bloccante. this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(() => { // Caso in cui MainWindow esiste già foreach (Window window in System.Windows.Application.Current.Windows) { if (window is MainWindow) { MainWindow w = window as MainWindow; w.NewTab(properties.client, stream, properties.address); w.ActiveConnectionsIPList.Add(properties.address); this.Close(); return; } } // Caso in cui MainWindows non esiste: creazione di una nuova MainWindow MainWindow main = new MainWindow(properties.client, stream, properties.address); main.ActiveConnectionsIPList.Add(properties.address); this.Close(); main.Show(); })); try { properties.client.EndConnect(result); } catch (SocketException) { // In caso di errore sul socket: chiusura del nuovo tab ExceptionHandler.ConnectionError(); } catch (ObjectDisposedException) { // In caso di chiusura del socket: chiusura del tab ExceptionHandler.ConnectionError(); } }
/// <summary> /// Funzione che tenta di instaurare la connessione. Riavvia l'interfaccia di connessione se la connessione fallisce. /// In caso di connessione riuscita, crea la Window principale (MainWindow) se non già esistente /// Se già esistente invece, perchè già si è collegati ad un altro server, crea un nuovo tab /// </summary> /// <param name="result"> Struttura contenente il risultato delle operazioni asincrone </param> private void ConnectionRequest(IAsyncResult result) { ClientProperties properties = result.AsyncState as ClientProperties; // Nel caso in cui la connessione fallisce if ((properties == null) || (!properties.client.Connected)) { MessageBox.Show("Impossibile stabilire una connessione"); this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(() => { // Abilitazione dei vari componenti dell'interfaccia ConnectButton.IsEnabled = true; txtAddress1.IsEnabled = txtAddress2.IsEnabled = txtAddress3.IsEnabled = txtAddress4.IsEnabled = true; txtPort.IsEnabled = true; this.Cursor = Cursors.Arrow; })); return; } NetworkStream stream = properties.client.GetStream(); // Imposto il tempo in cui il client si mette in attesa di ricevere dati stream.ReadTimeout = 5000; // Se la connessione ha avuto successo, bisogna verificare se esiste già una MainWindow // - Se esiste, significa che non bisogna crearne una nuova, ma bisogna solo aggiungere un tab // - Se non esiste, significa che bisogna crearne una nuova this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(() => { // Caso in cui MainWindow esiste già foreach (Window window in System.Windows.Application.Current.Windows) { if (window is MainWindow) { MainWindow w = window as MainWindow; w.NewTab(properties.client, stream, properties.address); w.ActiveConnections.Add(properties.address); this.Close(); return; } } // Caso in cui MainWindows non esiste: creazione di una nuova MainWindow MainWindow main = new MainWindow(properties.client, stream, properties.address); main.ActiveConnections.Add(properties.address); this.Close(); main.Show(); })); try { properties.client.EndConnect(result); } catch (SocketException) { // In caso di errore sul socket: chiusura del nuovo tab ExceptionHandler.ConnectionError(); } catch (ObjectDisposedException) { // In caso di chiusura del socket: chiusura del tab ExceptionHandler.ConnectionError(); } }