Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
App. WinForms / WPF .NET
Chiusura thread in csharp
mercoledì 26 agosto 2009 - 11.35
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
eomer75
Profilo
| Newbie
6
messaggi | Data Invio:
mer 26 ago 2009 - 11:35
Buon giorno..
In questi giorni sto implementando un protocollo di scambio dato su porta seriale, e quindi la mia applicazione una più thread. In genere uno per l'ascolto sulla porta e uno per consumare i dati letti.
Per chiudere i thread ho pensato di far terminare il ciclo con delle variabili booleane, come in questo prammento di codice:
public void Read()
{
bool read = true;
while (read && !_stop)
{
try
{
//throw new Exception();
if (!_serialPort.IsOpen)
_serialPort.Open();
int c = _serialPort.ReadChar();
if (c > -1)
{
read = true;
if (direction == MessageData.Direction.Read)
{
MessageData.DataList.ManageItemRead(Convert.ToChar(c), MessageData.OperationType.Add);
}
else
{
MessageData.DataList.ManageItemWrite(Convert.ToChar(c), MessageData.OperationType.Add);
}
ReiseEventMessage(Convert.ToChar(c));
}
}
catch (TimeoutException)
{
ReiseEventMessage("timeout...");
ReiseEventMessage("errore", "timeout");
}
catch (Exception ex)
{
ReiseEventMessage("Errore Lettura: " + ex.Message);
ReiseEventMessage("errore", ex.Message);
}
}
if(_stop)
{
_serialPort.Close();
}
}
il ciclo è interrotto dal non verificarsi di questa condizione:
while (read && !_stop)
quindi per terminare il thread ho implementato il seguente metodo
public static void AbortPortThread()
{
UsiPortConnectorDll.ComPort.Stop = true;
System.Threading.Thread.Sleep(500);
if (BCIManager.threadComPort != null)
{
//threadComPort.Join();
BCIManager.threadComPort = null;
}
}
UsiPortConnectorDll.ComPort.Stop = true setta a true il flag _stop.
In effetti esco dal while, quando tale flag viene impostato a true, ma il thread non termina.
Se decommento la riga //threadComPort.Join(); l'applicazione resta bloccata per tempo indefinito.
La classe che espone il metodo read viene instanziata tramite SIngleton, visto che per i miei scopi basta una sola istanza.
Ma perchè nonostante il return del metodo, il thread non termina.
Ora per farlo terminare quando termina il ciclo di vita dell'applicazione, ho impostato
BCIManager.threadComPort.IsBackground = true;
Si noti che il thread è variabile statica della classe.
Federico
Torna su
Stanze Forum
Elenco Threads
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?
Dopo esserti registrato potrai chiedere
aiuto sul nostro
Forum
oppure aiutare gli altri
Consulta le
Stanze
disponibili.
Registrati ora !