Ciao a tutti
dopo aver letto tonnellate e tonnellate di pagine e forum online mi ritrovo a chiedere qui aiuto ai miei problemi, il forum di html.it ultimo baluardo delle mie speranze xD
Vi espongo la situazione, sperando di stuzzicarvi un po'. Dispongo di...
- Un form "padre" e dei form "figli"
- Un oggetto che, alla ricezione dei dati da un dispositivo su porta COM, scatena degli eventi (in base ai dati ricevuti).
- Delle funzioni delegate opportunamente associate agli eventi di cui sopra.
Quello che sto cercando di fare è di interrogare il dispositivo chiedendogli l'ID. Il protocollo di comunicazione funziona ed i dati transitano sempre nel modo opportuno. Il delegato che si occupa di aggiornare l'etichetta corrispondente all'ID in uno dei form figli di cui sopra controlla se il thread che vuole modificare l'elemento è quello che ha generato l'elemento oppure no: nel caso in cui non lo fosse (ed ovviamente, non lo sarà) l'elemento da modificare invocherà una nuova istanza del delegato mediante la funzione "BeginInvoke".
La funzione viene quindi richiamata nuovamente e... l'interfaccia si pianta. Perdo ogni controllo sul form padre e su tutti i figli. Le ho provate TUTTE, anche forzando la chiusura del metodo BeginInvoke tramite EndInvoke passandogli l'opportuna variabile di stato di tipo IAsyncRes, ma non ottengo un risultato differente.
Ho notato (durante un po' di debug) che, facendo apparire una messageBox in una parte del programma i dati sull'interfaccia me li aggiorna (quindi di fatto il delegato esegue il suo compito) ma comunque l'interfaccia si pianta in maniera irremovibile.
Come posso risolvere? Spero in una vostra cortese risposta. Ringrazio in anticipo chiunque si dedichi alla risoluzione di questo problema. 
Di seguito vi posto il codice della funzione delegata...
codice:
/* updateDtReleaseEVentArgs è un oggetto che estende EventArgs, per permettere lo scambio dati. Al suo interno contiene la definizione dell'Handler, messa li per una mera questione di comodità... */
public void updateDtRelease(Object sender, updateDtReleaseEventArgs args)
{
// Nell'if ci entra alla prima invocazione, poichè il thread è differente da quello che ha creato l'etichetta lbl_deviceModel_val
if (lbl_deviceModel_val.InvokeRequired)
{
lbl_deviceModel_val.BeginInvoke
(
new updateDtReleaseEventArgs.updateDtReleaseEventHandler(this.updateDtRelease),
new Object[] { sender, args }
);
}
// Qui ci entra invece alla seconda invocazione, quando è la stessa etichetta ad invocare il delegato
else
{
lbl_deviceModel_val.Text = args.modelID + " v" + args.modelRev;
}
}