Jakékoli řešení nelegálního Cross Thread operace výjimkou?

hlasů
15

Když se údaje vázat v jazyce C #, nit, která změní data způsobí, že ovládací prvek příliš měnit. Ale pokud toto vlákno není ten, na kterém byl vytvořen kontrolní, dostanete neplatnou Cross tématu Operace výjimku.

Je tam tak jako tak, aby se zabránilo to?

Položena 05/08/2008 v 08:45
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
3

V případě, že změna dat není příliš časově náročné (to znamená, pokud je hlavním cílem pozadí nití na není skutečná změna data), zkuste pohybující se část, která upravuje data do delegáta a Invoke'ing že delegáta.

Je-li skutečná těžká práce je na základě dat, pravděpodobně budete muset vytvořit hlubokou kopii těchto údajů, které budou předány závit na pozadí, která bude opět posílat zpracovaná data zpět do UI závitu pomocí Invoke.

Budete mít jen přesunout kód, který mění velikost ukládaných dat do funkce delegáta (protože změna dat je to, co spouští aktualizaci nastavení). Jiné, než to, neměli byste napsat něco navíc.

Odpovězeno 05/08/2008 v 09:05
zdroj uživatelem

hlasů
3

Měli byste být schopni udělat něco jako:

if (control.InvokeRequired)
{
    control.Invoke(delegateWithMyCode);
}
else
{
    delegateWithMyCode();
}

InvokeRequired je vlastnost, o kontrolách zjistit, jestli jste na správné vlákno, potom Invoke vyvolá delegáta na správném nití.

UPDATE: Ve skutečnosti, v mém posledním zaměstnání jsme udělali něco takového:

private void SomeEventHandler(Object someParam)
{
    if (this.InvokeRequired)
    {
        this.Invoke(new SomeEventHandlerDelegate(SomeEventHandler), someParam);
    }

    // Regular handling code
}

což odstraňuje potřebu jiného bloku a druh zpřísňuje kód.

Odpovězeno 05/08/2008 v 08:51
zdroj uživatelem

hlasů
1

Jako nemám modelový případ jít od nemohu zaručit toto řešení, ale zdá se mi, že scénář podobný tomu, který slouží k aktualizaci ukazatele průběhu v různých nití (pouze delegáta) by bylo vhodné zde.

public delegate void DataBindDelegate();
public DataBindDelegate BindData = new DataBindDelegate(DoDataBind);

public void DoDataBind()
{
    DataBind();
}

V případě, že vázání dat je třeba udělat určitým nití, nechť že nit dělat práci!

Odpovězeno 05/08/2008 v 08:56
zdroj uživatelem

hlasů
0

Ve WPF a Silverlight má vazby infrastruktury péči o přepnutí do UI závitu.

Odpovězeno 08/08/2008 v 17:19
zdroj uživatelem

hlasů
0

V případě, že nit hovoru je „nelegální“ (tj DataBind volání ovlivňuje ovládací prvky, které nebyly vytvořeny v závitu je volána z), pak je třeba vytvořit delegáta, takže i v případě, že rozhodnutí / příprava na DataBind není provedeno závitu ovládacího vytvářet jakýkoliv výsledný modifikace z nich (tj DataBind ()) bude.

Byste nazvali svůj kód z pracovního vlákna, jako je takto:

this.BindData.Invoke();

To by pak mohla způsobit původní vlákno dělat vázání, který (za předpokladu, že je nit, která vytvořila kontroly) by měl fungovat.

Odpovězeno 05/08/2008 v 09:06
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more