Buongiorno a tutti.
Come da titolo sono incappato in questo errore.
Sto cercando di sviluppare un progetto di tipo DLL che stia sempre in ascolto su un socket (ma potrebbe essere anche una seriale) e che inneschi un evento quando arriva un pacchetto prestabilito da una unità esterna connessa appunto in Ethernet o seriale.
Per fare ciò ho pensato di fare il tutto in un thread apposito fatto come di seguito (ho tralasciato i dettagli implementativi che penso non servano)
Nella classe ho dichiarato:
private Thread ReadTcpData; //thread lettura dati TCP
public delegate void DataReceivedEventHandler(TcpThreadExch thd);
public event DataReceivedEventHandler DataReceived;
Nel costruttore della classe:
nota: thrTcp è una classe usata per lo scambio dati con il thread internamente
ReadTcpData = new Thread(ThreadReadTcpData); //istanzio il thread lettura dati TCP
ReadTcpData.Start(thrTcp);
Ed il thread è così:
do
{
try
{
while ((nbrec = stream.Read(btrec, 0, btrec.Length)) != 0) //fino a che ho dei byte nel buffer di ricezione
{
//...
// qui c'è tutto il codice che si occupa di ricevere ed analizzare i dati (in questo caso da un socket)
// tcpthr è una classe che utilizzo per lo scambio dati del thread
//...
tcpthr.recDataString = Encoding.ASCII.GetString(dataRec.ToArray());
DataReceived.Invoke(tcpthr);
}
}
catch (Exception ex)
{
//qui gestirò gli errori
}
Thread.Sleep(100);
} while (!tcpthr.exit); //qui esco quando serve
Da una applicazione windows form poi istanzio la mia DLL e creo il metodo per l'evento
private void Form1_Load(object sender, EventArgs e)
{
tcps = new TcpServer("127.0.0.1", 11000, 512);
tcps.DataReceived += new TcpServer.DataReceivedEventHandler(Tcp_DataReceived);
}
protected void Tcp_DataReceived(TcpThreadExch dataReceived)
{
string pippo = dataReceived.recDataString;
try
{
label1.Text = pippo;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Ora, l'evento si innesca e nella variabile pippo ho effettivamente la stringa dei dati letti, ma quando cerco di scriverla in una label ottengo l'errore nel titolo. Evidentemente non ho capito come fare un thread "thread safe" usando correttamente i delegate...
Potete aiutarmi a capire?
Grazie