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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top