DependencyObject.Dispatcher Свойство
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Возвращает CoreDispatcher , с которым связан этот объект. CoreDispatcher представляет средство, которое может получить доступ к DependencyObject в потоке пользовательского интерфейса, даже если код инициируется потоком, не относящегося к пользовательскому интерфейсу.
public:
property CoreDispatcher ^ Dispatcher { CoreDispatcher ^ get(); };
CoreDispatcher Dispatcher();
public CoreDispatcher Dispatcher { get; }
var coreDispatcher = dependencyObject.dispatcher;
Public ReadOnly Property Dispatcher As CoreDispatcher
Значение свойства
CoreDispatcher, с которым связан объект DependencyObject, который представляет поток пользовательского интерфейса.
Примеры
В этом примере показано использование Dispatcher для неявного файла кода программной части для страницы. В этом примере для добавления реализации DispatchedHandler используется лямбда-выражение. Сам обработчик обрабатывает событие Accelerometer.ReadingChanged , которое не будет выполняться в потоке пользовательского интерфейса.
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);
});
}
Комментарии
Свойство Dispatcher предоставляет ссылку CoreDispatcher , которую можно использовать для маршалинга вызовов, поступающих из потоков, не относящихся к пользовательскому интерфейсу, с помощью RunAsync и функции ожидания. Дополнительные сведения о ожидаемых функциях см. в статье Вызов асинхронных API в C# или Visual Basic. См. также раздел "DependencyObject и потоки" справочного раздела DependencyObject .
DependencyObject должен быть создан в потоке пользовательского интерфейса и иметь сходство с потоком пользовательского интерфейса. Так как это точка входа, которая позволяет получать данные между потоками, DependencyObject.Dispatcher является единственным API экземпляра DependencyObject или любого из его подклассов, к которым можно получить доступ из потока, не относящегося к пользовательскому интерфейсу, не вызывая исключения между потоками. Все остальные API DependencyObject создают исключение при попытке вызвать их из рабочего потока или другого потока, не относящегося к пользовательскому интерфейсу.
В частности, свойство Dispatcher получает CoreDispatcher , связанный с потоком пользовательского интерфейса приложения. Выполнение кода с помощью метода RunAsyncCoreDispatcher необходимо, если вы планируете запрашивать или изменять значение любого свойства зависимостей, даже если этот объект еще не связан с визуальным деревом XAML или видимым пользовательским интерфейсом (визуальным корнем окна приложения).
Window.Dispatcher также ссылается на CoreDispatcher , связанный с потоком пользовательского интерфейса. Window.Dispatcher — это всего лишь оболочка для CoreWindow.Dispatcher , поэтому класс Window имеет к нему простой доступ.
Примечание
Подключение для значения диспетчера недоступно во время разработки. Это может вызвать проблемы, если вы создали пользовательский элемент управления, использующий значения Диспетчера, и к этому коду обращается среда времени разработки через пути кода, которые используются в представлении конструктора, например конструкторы и загруженные обработчики. Если вы пишете пользовательский элемент управления и столкнулись с этой проблемой, попробуйте ввести условный аргумент guard в коде, например не вызывать этот код, если DesignModeEnabled имеет значение true.