>Scusa peò non capisco una cosa....
>non riesco a capire a cosa mi possa servire nel mio caso........
>La comunicazione deve avvenire alla pressione di un pulsante
>e se il server non c'e' deve comunicarmelo con una message box
>e fermare il thread....
>
La gestione dei thread purtroppo non è una delle più semplici. Parti dal presupposto che ci sono dei vincoli architetturali da rispettare, non puoi ad esempio accedere ai controlli della form chiamante ma devi utilizzare dei metodi particolari (http://msdn.microsoft.com/en-us/library/ms171728.aspx) oppure devi gestire la cosa con degli eventi. Il backgroudWorker è stato creato apposta per semplificare tutta questa gestione e ti consente di farlo con due semplici eventi. Al suo interno ha inoltre la gestione delle eventuali eccezzioni.
Ti ho modificato il progetto facendo una piccola prova e a me funziona correttamente.
Dalla funzione threadwrite ho tolto tutte le messagebox.
Poi ho inserito il backgroundWorker nella form e ho modificato la chiamata passando come argomento il testo da inviare:
bgClient.RunWorkerAsync(txtbox.Text);
Successivamente nell'evento DoWork ho fatto l'invio:
private void bgClient_DoWork(object sender, DoWorkEventArgs e)
{
//Invia il comando
this.t.threadwrite(e.Argument);
}
e nel RunWorkerCompleted ho messo la gestione del risultato una volta completata l'operazione:
private void bgClient_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//Gestione operazione completata
if (e.Error == null)
{
MessageBox.Show("Operazione completata correttamente");
}
else
{
MessageBox.Show(String.Format("Errore durante esecuzione: {0}", e.Error.Message));
}
}
PS: se per caso in debug ti da errore e si ferma nell'istruzione threadwrite è una cosa normale perchè non è stata gestita l'eccezione. Se lo fai andare avanti con F5 o se lo lanci senza debug vedrai che subito dopo va nell'evento completed e visualizza la message box.
Potrai comunque modificare il codice a tuo piacimento, ad esempio inserirendo la gestione del parametro result direttamente nel DoWork:
private void bgClient_DoWork(object sender, DoWorkEventArgs e)
{
try
{
//Invia il comando
this.t.threadwrite(e.Argument);
e.Result = true;
}
catch
{
e.Result = false;
}
}
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko