Qualche soluzione all'eccezione dell'operazione Cross Thread illegale?
-
08-06-2019 - |
Domanda
Quando si esegue l'associazione dati in C#, il thread che modifica i dati determina la modifica anche del controllo.Ma se questo thread non è quello su cui è stato creato il controllo, otterrai un'eccezione Illegal Cross Thread Operation.
Esiste un modo per impedirlo?
Nessuna soluzione corretta
Altri suggerimenti
Dovresti essere in grado di fare qualcosa come:
if (control.InvokeRequired)
{
control.Invoke(delegateWithMyCode);
}
else
{
delegateWithMyCode();
}
InvokeRequired è una proprietà su Controls per vedere se sei sul thread corretto, quindi Invoke richiamerà il delegato sul thread corretto.
AGGIORNAMENTO:In realtà, nel mio ultimo lavoro abbiamo fatto qualcosa del genere:
private void SomeEventHandler(Object someParam)
{
if (this.InvokeRequired)
{
this.Invoke(new SomeEventHandlerDelegate(SomeEventHandler), someParam);
}
// Regular handling code
}
che elimina la necessità del blocco else e in un certo senso rende più rigido il codice.
Poiché non ho un caso di test da cui partire, non posso garantire questa soluzione, ma mi sembra che uno scenario simile a quello utilizzato per aggiornare le barre di avanzamento in thread diversi (utilizzare un delegato) sarebbe adatto qui.
public delegate void DataBindDelegate();
public DataBindDelegate BindData = new DataBindDelegate(DoDataBind);
public void DoDataBind()
{
DataBind();
}
Se l'associazione dei dati deve essere eseguita da un thread particolare, lascia che sia quel thread a fare il lavoro!
Se la chiamata al thread è "illegale" (ad es.la chiamata DataBind influisce sui controlli che non sono stati creati nel thread da cui viene chiamato), è necessario creare un delegato in modo che, anche se la decisione/preparazione per DataBind non viene eseguita nel thread di creazione del controllo, qualsiasi modifica risultante di loro (cioèDataBind()) lo sarà.
Chiameresti il mio codice dal thread di lavoro in questo modo:
this.BindData.Invoke();
Ciò farebbe quindi sì che il thread originale esegua l'associazione, che (presumendo che sia il thread che ha creato i controlli) dovrebbe funzionare.
In WPF e Silverlight l'infrastruttura di associazione si occupa del passaggio al thread dell'interfaccia utente.