Vra

In 'n WPF aansoek Ek het 'n Background draad skep van 'n voorwerp. Kom ons noem die voorwerp cat.

Agtergrond werker kode:

SomeClass foo = new SomeClass();
// Do some operation on foo

// Set some dependency property on the main class to foo
this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
    (SendOrPostCallback)delegate { SetValue(FooProperty, foo); },
    foo);

Nou, wanneer die hoofklas probeer om toegang te verkry FooProperty met behulp van 'n lucky, kry ek 'n InvalidOperationException: Die roeping draad kan nie toegang tot hierdie voorwerp, want 'n ander draad besit dit

.

As die draad die skep van die voorwerp is klaar, hoekom is dit steeds die eienaar van die voorwerp? Is daar een of ander manier om hierdie.?

Was dit nuttig?

Oplossing

'n voorwerp wat jy maak in 'n gegewe draad is in besit van daardie draad. Dis hoekom jy kry 'n InvalidOperationException. As jy wil graag 'n eiendom in 'n agtergrond draad, ek beveel aan dat die afgevaardigde terugkeer die verlangde waarde en roep SetValue van jou hoof draad. (Draad wat die voorwerp geskep).

Ander wenke

Die oorgrote meerderheid van die voorwerpe in WPF het draad affiniteit. Wat een keer geskep op 'n spesifieke draad, sal 'n WPF voorwerp dan slegs werk wanneer dit gebruik word uit daardie draad. Hierdie beperking afgedwing (in teenstelling met Winforms) op feitlik elke operasie wat jy doen op daardie voorwerp.

Jy sal nodig hê om jou kode Foo geskep op die werklike UI draad vir hierdie scenario te hê verander.

Die aanvaarding van SomeClass is afgelei van DispatcherObject, die draad wat dit geskep loop die boodskap pomp wat verantwoordelik is vir die verwerking van boodskappe vir die foo voorwerp. Daarom, as wat draad eindig dan die voorwerp kan nie meer boodskappe te verwerk, wat nie 'n goeie idee.

In die meeste gevalle jy moet dieselfde UI draad gebruik om al jou UI voorwerpe (of enigiets anders wat is afgelei van DispatcherObject skep en maak seker dit loop vir die duur van jou aansoek. Gebruik dan die Dispatcher om boodskappe te stuur uit jou werker drade.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top