Diskuze: BackgroundWorker v knihovně DLL
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 6 zpráv z 6.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj, samozřejmě to jde. Já bych použil delegáty a při volání funkce jeden z parametrů metody by byla proměnná typu generický delegát např. Action<string> callback
volání delegáta se pak provádí callback.Invoke("pokus");
a v tomhle případě bych se vykašlal na background worker a rovnou to spustil pomocí Task třídy.
Nicméně moc nechápu to volání z vlákna, které je už dokončené...pokud je myšleno že například formulář, ze kterého byl otevřen nový thread byl mezitím už zavřen... tak to se dá při zpětném volání pomocí delegáta udělat např takto.
if this.Disposed == false
{
this.Invoke(návrathodnota); 'invoke se musí použít kvůli volání prvku
ve formuláři z jiného než main vlákna
}
snad je to trošku srozumitelný
ted ještě koukám, že v tý rychlosti jsem to trošku pomotal Ten kód co se spouští při
zpětném spuštění delegáta už ve formuláři tak by byl asi takto (pouze
pro winforms)
if (this.Disposed == false)
{
this.Invoke(() => this.label.text = navrathodnota); //lambda pro volání
prvku formuláře...
}
te´d už to mám snad správně kdyby jsi měl potíž, napíšu tu proceduru včetně volání
celou... nicméně pročti tady na itnetwork články o delegátech...
Díky za radu. Delegáty jsem zatím nikdy nepoužíval a budu se na ně
muset nejprve podívat. .
Nakonec jsem to vyřešil pomocí události, mimochodem tu jsem použil taky
poprvé .
V té dll jsem vytvořil událost a v RunWorkerCompleted ji naplnil výsledky
toho co se zpracovalo v DoWork. Pak jsem v programu, který použil dll událost
zachytil a data co vrátila zpracoval.
Asi to nepopisuji správnými slovy, ale berte to s reservou jsem samouk .
No událost je taky vlastně druh delegáta (v kolekci) a funguje stejně
Tak aspoň že to funguje. Backround worker vrací řízení zpět do původního vlákna. Což je pro obsluhu formuláře fajn. Kdybys to chtěl dělat jen pomocí task nebo si spustit thread ručně, tak nezapomeň volat prvky formuláře pomocí invoke. Usuzuji používáš winforms podle toho volání labelu
Jojo ve všem máš pravdu, používám VB.NET a winforms.
Měl jsem podezření, že ty události mají s delegáty dost společného.
Původně jsem se rozhodovat mezi thread a BackgrounWorkerem a ten druhý to
vyhrál. Dobře se s ním pracuje a není to tolik náchylné na moje chyby z
neznalosti a blbosti.
Ještě jednou díky.
Zobrazeno 6 zpráv z 6.