Windows 8 için bir Windows Store App oyuncak uygulaması yazıyorum. TextBlock
ile yalnızca bir xaml sayfası var.Windows Mağazası App UI güncelleştirmesi
this.DataContext = new MyTimer();
MyTimer
INotifyPropertyChanged
uygular ve mal Time
güncellenmesi bir zamanlayıcı ile yapılır:
public MyTimer(){
TimerElapsedHandler f = new TimerElapsedHandler(NotifyTimeChanged);
TimeSpan period = new TimeSpan(0, 0, 1);
ThreadPoolTimer.CreatePeriodicTimer(f, period);
}
TextBlock
sahiptir
private void NotifyTimeChanged(){
if (this.PropertyChanged != null){
this.PropertyChanged(this, new PropertyChangedEventArgs("Time"));
}
}
ile sayfa
DataContext
olarak sınıf MyTimer vardır Zaman
adresindeki bir veritabanında
<TextBlock Text="{Binding Time}" />
Ben şu istisna var uygulamayı çalıştırdığınızda: mesajın asıl sorun Sınıf MyTimer özelliği güncelleştiriyorum olmasıdır
The application called an interface that was marshalled for a different thread. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))
ile
System.Runtime.InteropServices.COMException was unhandled by user code
, GUI'nin kendisi değil, Bunu çözemiyorum ama çözümün this one gibi bir şey kullanması gerektiğini düşünüyorum.
Çok teşekkürler. Bu, eşzamansız bir çağrı kullandığımda SynchronizationContext'i kullanmam gerektiğini önerir. Async anahtar kelimesiyle böyle bir şey yapmayı düşüneceğim. – Gabber
Evet, C# 4.5'ün anahtar kelimesini bekliyorsanız, bunu varsayılan olarak alacaksınız. –
Cevabınız için teşekkürler!Ben sadece bir sidenote eklemek istiyorum: Eğer UI bağlamında geri aramak istiyorsanız, UI inşa edilmiş olandan daha kısa bir sürede "SynchronizationContext" 'i yakaladığınızdan emin olun (bunu yapmak için 'OnLaunched' olay işleyicisini kullanıyorum), aksi halde Kaptığın bağlam hizmet etmeyecek. Daha fazla bilgi için: http://www.codeproject.com/Articles/31971/Understanding-SynchronizationContext-Part-I – Lvsti