Chiusura thread in csharp

mercoledì 26 agosto 2009 - 11.35

eomer75 Profilo | Newbie

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
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 !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5