Piszę aplikację zabawkową Windows Store App dla Windows 8. Ma tylko jedną stronę xaml z TextBlock
. Strona ma MyTimer klasy jako DataContext
:Aktualizacja interfejsu Windows Store App
this.DataContext = new MyTimer();
MyTimer
implementuje INotifyPropertyChanged
i uaktualnianie właściwości Time
jest wykonany z zegarem:
public MyTimer(){
TimerElapsedHandler f = new TimerElapsedHandler(NotifyTimeChanged);
TimeSpan period = new TimeSpan(0, 0, 1);
ThreadPoolTimer.CreatePeriodicTimer(f, period);
}
z
private void NotifyTimeChanged(){
if (this.PropertyChanged != null){
this.PropertyChanged(this, new PropertyChangedEventArgs("Time"));
}
}
TextBlock
ma databinding na czas
<TextBlock Text="{Binding Time}" />
Kiedy uruchomić aplikację Mam następujący wyjątek:
System.Runtime.InteropServices.COMException was unhandled by user code
z komunikatem
The application called an interface that was marshalled for a different thread. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))
Prawdziwym problemem jest to, że ja uaktualniania własność MyTimer klasy, nie sam GUI, Nie mogę tego rozgryźć, ale myślę, że rozwiązanie powinno używać czegoś takiego jak this one.
Wielkie dzięki. Sugeruje to, że będę musiał używać kontekstu synchronizacji przy każdym użyciu asynchronicznego wywołania ... Zastanowię się nad robieniem czegoś takiego również za pomocą asynchronicznego słowa kluczowego. – Gabber
Tak, jeśli używasz słowa kluczowego w języku C# 4.5, domyślnie otrzymasz to. –
Dzięki za odpowiedź!Chcę tylko dodać sidenote: jeśli chcesz oddzwonić w kontekście interfejsu użytkownika, upewnij się, że przechwytujesz 'SynchronizationContext 'nie wcześniej niż został zbudowany interfejs użytkownika (do tego celu używam programu obsługi zdarzeń' OnLaunched'), w przeciwnym razie kontekst, który chwytasz, nie będzie służyć. Więcej informacji można znaleźć na stronie: http://www.codeproject.com/Articles/31971/Understanding-SynchronizationContext-Part-I – Lvsti