Vyvojari.sk na Facebooku
Správičky 2 187 Blogy 556 Fórum 13 473

Zaujímavosti zo sveta

23.02 Kyberkriminálníkem snadno a ry…
Počítačová bezpečnost prakticky: zabezpečení dat v klidu, zabezpečení dat v pohybu a anonymní připojení k Internetu. Témata dnes možná ještě…
22.02 TryJoinads (IV.) - Concurrency…
Join calculus provides a declarative way of expressing asynchronous synchronization patterns. It has been use as a basis for programming la…
22.02 Pozvánka: Windows 8 Hackathon …
vyvojar
Uvedení Windows 8 Consumer Preview se blíží (29.2.2012), a proto jsme již nyní naplánovali několik běhů Windows 8 Hackathonů, na které bycho…
22.02 Update rollup 6 pro Exchange S…
blogCZSK
Update Rollup 6 pro Exchange Server 2007 Service Pack 3 (SP3) je k dispozici na Microsoft Download centru. Řeší problém…
22.02 Pozvánka na akci: Bezpečné web…
Nikdy jsem se nebál platit kartou na Internetu, dokud jsem nebyl nucen z klientské strany implementovat komunikaci s platebními bránami. Pot…
21.02 Internet of Things s FEZ Panda…
vyvojar
Pojem Internet of Things byl poprvé použit v roce 1999 a jeho původní význam je označení sítě jednoznačně identifikovatelných objektů (RFID,…
21.02 Záznam a prezentace z šestého …
blogCZSK
V tomto dílu vás Pavel Řepa seznámil se Service Managerem 2012, nástrojem, jehož hlavním úkolem je…
21.02 GeekCore – nová verze a zdrojá…
Znáte tu situaci, kdy uživateli přehledně vysvětlíte, že jeho feature request je sice rozumná, ale příliš náročná na implementaci a přes noc…
20.02 Extrémní velikost databáze slu…
mazin
Před časem jsem řešil problém, kdy databáze služby Import uživatelských profilů měla velikost přes 21GB. To je na profily cca 150 členů domé…
20.02 TryJoinads (III.): Agent-based…
Another area where the match! syntax can be used is when programming with F# agents, implemented by the MailboxProcessor type. Formally, ag…
20.02 Soužití Office 365 a BlackBerr…
blogCZSK
V první dílu Office 365 akademie jste se mimo jiné ptali, jak je na tom Office 365 s podporou mobilních zař&iacu…
20.02 ASP.NET MVC 4 Beta
ScottGu
A few days ago we released the ASP.NET MVC 4 Beta.  This is a significant release that brings with it a bunch of great new features and…
17.02 TryJoinads (II.): Task-based p…
The implementation of joinad operations for the Task<'T> type is quite similar to the implementation of Async<'T>, because the…
17.02 Co IT týden dal: havárie a bři…
blogCZSK
Kanty> Tak jsem si dnes ráno zadělal na menší infarkt. Abyste plně pochopili hloubku mého hrůzného pro…
17.02 Update Rollup 2 pro rodinu Win…
blogCZSK
Před několika dny Microsoft vydal souhrnnou opravu Update Rollup 2 pro všechny systémy patřící do rodiny Windows…
16.02 Odkazy z prohlížeče – 16.2.201…
atasoft
CodeProject Stop Watch application for Windows Phone 7 Learning XNA 2d Engine IceCream With 1945 Demo Project C# Language Features…

Threading a INotifyPropertyChanged v Silverlighte

duracellko - 24. 1. 2012 6:43 - 182 views

Ak sa aj vám stalo, že ste v Silverlighte alebo WPF dostali TargetInvocationException: Invalid cross-thread access. Tak tento blog je práve pre vas.

http://10rem.net/blog/2012/01/10/threading-considerations-for-binding-and-change-notification-in-silverlight-5

Asi najčastejšie je táto výnimka spôsobená, keď nejaký Page alebo UserControl sleduje zmeny na objekte, lebo má nastavený data-binding, a tento objekt sa zmení na inom threade. A práve tento prípad rozoberá spomínaný blog.


Rasťo Novotný

Microsoft Certified Application Developer
Microsoft Certified Professional Developer: Web Developer

Programovať som začal vo Visual Basic ešte verzia 3.0 (ale aj VBA pre MS Office) a pokračoval som až do verzie 6.0. Potom som sa preorientoval na platformu .NET, kde pracujem s oboma jazykmi C# aj VB. Tu robím desktopové aj webové aplikácie, ale aj webové služby.

Článkov: 5, Správičiek: 28, Príspevkov vo fóre: 502, Príspevkov v blogu: 27, Bodov: 4720
Najaktívnejší č.: 7
Profil používateľa

Reakcie

# ... 24. 1. 2012 13:38:17 T

Neviem, preco sa robi okolo toho take halo :-) Podla mna je to o dodrzani jednoduchych zasad.
VM by mal byt updateovany zasadne z GUI Threadu.
Z hladiska testovatelnosti (ak niekomu ide primarne o nu) by mali byt async volania riesene "nad" VM a nie na jeho urovni.

# @T 24. 1. 2012 21:04:32 liero


1. Vo wpfku to funguje aj bez toho
2. V GUI threade staci preposielat iba notifikacie, kedze ta vyvola iba zavolanie gettera, cize tam nevadi, ak medzi nastavenim property a naslednim zavolanim gettera z bindingu sa hodnota zmenila.
3. s kolekciami CollectionChanged to nieje take jednoduche. Tu je to dost velky problem, preto to vo wpf 4.5 vyriesili tak, ze to za nas riesi framework. zatial neviem ako, ale testoval som to a funguje to skvele.
4. Problem je, ku COM Objektom mozes pristupovat vzdy iba z toho thraedu v ktorom si ich vytvoril a to skoro nikdy nieje UI Thread, a potom by sa ti mohlo stat, ze kvoli prepinaniu sa do UI threadu by musel ten druhy thread cakat, co by mohlo mat velky performace efekt. da s to sice vzdy nejako obist, ale komplikovane.

pri klasickych asynchronnych scenaroc to nieje problem, ale asynchronne nerovna sa multithreadovo. Pri masivnom multithreadingu by si sa lahko zamotal, deadlockol a podobne

# ... 25. 1. 2012 8:54:16 T

1. v tom istom zmysle ako vo win forms.
2. 3. tomu celkom nerozumiem, ale ak chces povedat, ze musis invokenut notifyPropChanged v GUI threade tak je to len potvrdenie mojho tvrdenia. Property samozrejme updatenut mozes aj z ineho threadu ale musis zabezpecit aby sa na jej zmenu reagovalo v GUI threade. Samozrejme, get/set na nejakom objekte mozes volat napriec threadmi a ak z povahy kodu mas zabezpecene, ze sa nepobiju dve vlakna nemusis riesit nic, inak musis synchronizovat a najjednoduchsi a najbezpecnjsi sposob je v nasom scenari delegovat updateovanie VM do GUI threadu.
4. Ach. Zalezi ci ide o STA alebo MDA COM. GUI COM veci su samozrejme STA.
Co si chcel povedat "a to skoro nikdy nieje UI Thread" netusim. Ani to co si presne predstavujes pod "prepinanim sa" do GUI threadu. Skus mi vlastne vysvetlit o com je cely tento bod, skus mi nacrtnut scenar/problem, ktory opisujes, kludne aj kodom.

"pri klasickych asynchronnych scenaroc to nieje problem, ale asynchronne nerovna sa multithreadovo. Pri masivnom multithreadingu by si sa lahko zamotal, deadlockol a podobne"

na toto som uz fakt nemam silu reagovat :-( Len ma utvrd v tom, ze nestudujes na FITke.

# @ 26. 1. 2012 12:03:17 liero

1. v WPF mozes preposlat notifikaciu aj v inom threade, ten binding je natolko sikovny, ze si to zosynchronizuje s dispatcherom sam. Cize tento tutorial sa nevztahuje na WPF. Silverlight si to sam spravit nevie.

3. S kolekciami nesmies manipulovat v jednom threade a preposielat len notifikacie do GUI threadu. Preco to tak je, to by bolo na dlhsie vysvetlenie ao funguje WPF, ale pave preto si WPF 4.5 uz vie poradit aj s notifikaciami CollectionChanged v inom threade

4. WPFko musi bezat ako STAThread aplikacia. Z toho vyplyva aj to, ze com ku objektom mozes pristupovat iba z jedneho threadu, vacsinou to nechces z GUI threadu, lebo nechces aby ti UI mrzlo. Aspon takto som to ja pochopil z tych mojich skusenosti s WPF a COM.


Cele to bolo o tom, ze zasada, ze VM ma by updatovany iba z GUI threadu nieje vobec taka jednoducha ako sa zda. Castokrat je jednoduchsie pouzit Approach 2 z toho linku, akurat ze ten nefunguje s ICollectionChagned.

# T 26. 1. 2012 16:38:16 ...

1. Je mozne ze Binding je sikovny, ale co potom robi? Tipujem, ze si zisti, ci je invokenuty z GUI threadu a ak nie, ide cez dispatcher. Mozem overit.
V kazdom pripade je to len barla, ktora pomaha hasit zly design.
3a) Kludne mi daj aj dlhe vysvetlenie, ja sa neurazim. (jediny problem tam moze byt v thread safety collectiony).
3b) Len si tipnem, ze ze to riesenie spociva v tom, ze kontroluje ci je obsluha udalosti v GUI threade a deleguje sa do GUI threadu.
3c) Ak by si ju updateoval v GUI threade nemas problem.
4. WPF app nie je COM, cize ani STA. (je STA like), vyuziva user32 msgs(pumpu) na cross thread volania a synchronizuje sa koly kompatibilite s niektorymi klucovymi COM componentami, ktore WPF vyuziva(napr. clipboard?) s user32 thread modelom. Ak si uvedomis toto, nehrozi Ti ziadna katastrofa.

Update VM v GUI threade je (moje?) odporucanie. Vacsina problemov, ktore spominas vypliva prave z nerespektovania tohoto pravidla.
Ak to robis inak a/alebo sa spoliehas sa na nejake fmwk zazraky zarabas si na problemy a hasis zly design resp. Ti v tom pomahaju magicky vo frameworku. Navyse pri tomto pristupe nemas problem ani so SL ani WPF z hladiska VM.

Titulok:


Meno:


Url:
Koľko je 22 + 4? (ochrana proti spamu)

Komentár:


Najaktívnejší užívatelia
1. 34510 b. photo vlko
2. 16055 b. photo T
3. 15330 b. photo spigi
4. 6025 b. photo dudok
5. 5515 b. photo slavof
6. 5040 b. photo siro
7. 4720 b. photo duracellko
8. 3625 b. photo jakub
9. 3490 b. photo lubolacko
10. 3340 b. photo skippo