DependencyObject.Dispatcher Proprietà
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Ottiene coreDispatcher a cui è associato questo oggetto. CoreDispatcher rappresenta una funzionalità che può accedere a DependencyObject nel thread dell'interfaccia utente anche se il codice viene avviato da un thread non dell'interfaccia utente.
public:
property CoreDispatcher ^ Dispatcher { CoreDispatcher ^ get(); };
CoreDispatcher Dispatcher();
public CoreDispatcher Dispatcher { get; }
var coreDispatcher = dependencyObject.dispatcher;
Public ReadOnly Property Dispatcher As CoreDispatcher
Valore della proprietà
CoreDispatcher a cui è associato l'oggetto DependencyObject, che rappresenta il thread dell'interfaccia utente.
Esempio
In questo esempio viene illustrato l'utilizzo di Dispatcher per l'implicito di un file code-behind per una pagina. In questo esempio viene usata un'espressione lambda per aggiungere l'implementazione DispatchedHandler . Il gestore stesso gestisce l'evento Accelerometer.ReadingChanged , che non verrà eseguito nel thread dell'interfaccia utente.
private async void ReadingChanged(object sender, AccelerometerReadingChangedEventArgs e)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
AccelerometerReading reading = e.Reading;
ScenarioOutput_X.Text = String.Format("{0,5:0.00}", reading.AccelerationX);
ScenarioOutput_Y.Text = String.Format("{0,5:0.00}", reading.AccelerationY);
ScenarioOutput_Z.Text = String.Format("{0,5:0.00}", reading.AccelerationZ);
});
}
Commenti
La proprietà Dispatcher fornisce il riferimento CoreDispatcher che può essere usato per effettuare il marshalling delle chiamate provenienti da thread non dell'interfaccia utente, usando RunAsync e una funzione awaitable. Per altre informazioni sulle funzioni awaitable, vedere Chiamare API asincrone in C# o Visual Basic. Vedere anche la sezione "DependencyObject e threading" dell'argomento di riferimento dependencyObject .
Un DependencyObject deve essere creato in un thread dell'interfaccia utente e ha affinità con il thread dell'interfaccia utente. Poiché si tratta di un punto di ingresso che consente l'accesso tra thread, DependencyObject.Dispatcher è l'unica API di istanza di DependencyObject o una delle relative sottoclassi a cui è possibile accedere da un thread non dell'interfaccia utente senza generare un'eccezione tra thread. Tutte le altre API DependencyObject generano un'eccezione se si tenta di chiamarle da un thread di lavoro o da un altro thread non dell'interfaccia utente.
In particolare, la proprietà Dispatcher ottiene CoreDispatcher associato al thread dell'interfaccia utente dell'app. L'esecuzione del codice tramite il metodo RunAsync di CoreDispatcher è necessaria se si intende eseguire una query o modificare il valore di qualsiasi proprietà di dipendenza, anche se tale oggetto non è ancora associato alla struttura ad albero visuale XAML o all'interfaccia utente visibile (radice visiva della finestra dell'app).
Window.Dispatcher fa anche riferimento a CoreDispatcher associato al thread dell'interfaccia utente. Window.Dispatcher è fondamentalmente solo un wrapper intorno a CoreWindow.Dispatcher in modo che una classe Window abbia accesso facile.
Nota
La connessione per un valore dispatcher non è disponibile in una visualizzazione in fase di progettazione. Ciò può causare problemi se è stato creato un controllo personalizzato che usa valori dispatcher e tale codice è accessibile da un ambiente in fase di progettazione tramite percorsi di codice usati da una visualizzazione progettazione, ad esempio costruttori e gestori caricati . Se si sta scrivendo un controllo personalizzato e si verifica questo problema, è consigliabile introdurre una protezione condizionale nel codice, ad esempio non chiamare tale codice quando DesignModeEnabled è true.