Когда для потока создается объект Dispatcher, он становится единственным объектом Dispatcher, который может быть связан с потоком, даже если этотDispatcher остановлен.
При попытке приложения получить CurrentDispatcher для текущего потока, в случае, если с потоком не связан объект Dispatcher, выполняется создание объекта Dispatcher.
Если Dispatcher остановлен, его невозможно перезапустить.
В WPF объект DispatcherObject доступен только для Dispatcher, с которым он связан. Например, фоновый поток не может обновить содержимое элемента управления Button, связанного с Dispatcher потока Пользовательский интерфейс. Чтобы фоновый поток получил доступ к свойству Content элемента управления Button, он должен делегировать работу объекту Dispatcher, связанному с потоком Пользовательский интерфейс. Это делается с помощью метода Invoke или BeginInvoke. Метод Invoke является синхронным, а BeginInvoke — асинхронным. Данная операция добавлена в очередь объектаDispatcher с заданным DispatcherPriority.
Если BeginInvoke вызывается для остановленного Dispatcher, свойству состояния возвращаемого объекта DispatcherOperation присваивается значениеAborted.
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
GameState.OnLoggined += (obj, erg) =>
{
GameState.FacebookAPI.Users.GetInfoAsync((info, s, ex) =>
{
this.Dispatcher.BeginInvoke(() =>
{
if (info != null)
litUserName.Text = info[0].name;
else
litUserName.Text = "Guest";
});
}, null);
};
}
В данном примере, на загрузке контрола асинхронно выполняется функция GetInfoAsync, по ее завершении мы имеем данные пользователя, авторизовавшегося в нашем приложении. Я всего навсего хотел было вывести имя пользователя в компоненту litUserName, но, как оказалось, не имел доступа к ним. Для получения доступа мне достаточно было обернуть часть кода в this.Dispatcher.BeginInvoke(() => { /* my code */ } ); и все решилось само собой, т.к. код выполняется теперь в контексте потока отвечающего за пользовательский интерфейс (или типа того)
invalid cross-thread access - я сначала даже испугался :)
ОтветитьУдалить