私は、Windows Store App ToyアプリケーションをWindows 8用に作成しています。 TextBlock
のxamlページが1つだけあります。ページはDataContext
としてクラスMyTimerがありますWindowsストアのApp UIの更新
this.DataContext = new MyTimer();
MyTimer
はINotifyPropertyChanged
を実装し、プロパティTime
の更新はタイマーで作られています:
private void NotifyTimeChanged(){
if (this.PropertyChanged != null){
this.PropertyChanged(this, new PropertyChangedEventArgs("Time"));
}
}
と
public MyTimer(){
TimerElapsedHandler f = new TimerElapsedHandler(NotifyTimeChanged);
TimeSpan period = new TimeSpan(0, 0, 1);
ThreadPoolTimer.CreatePeriodicTimer(f, period);
}
TextBlock
あり時間のデータバインディング
<TextBlock Text="{Binding Time}" />
私は次の例外を持っているアプリケーションを実行する場合:メッセージ
The application called an interface that was marshalled for a different thread. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))
で
System.Runtime.InteropServices.COMException was unhandled by user code
を本当の問題は、私はクラスMyTimerのプロパティを更新していますということですGUI自体ではなく、 私はそれを理解することはできませんが、解決策はthis oneのようなものを使うべきだと私は思う。
ありがとうございます。これは私が非同期呼び出しを使うたびにSynchronizationContextを使う必要があることを示唆しています...私はasyncキーワードでもそういうことをするつもりです。 – Gabber
C#4.5のawaitキーワードを使用している場合は、デフォルトでこれを取得します。 –
答えをありがとう!私はちょうどサイドローを追加したい:あなたがUIのコンテキストでコールバックしたい場合は、UIがビルドされたときにすぐに 'SynchronizationContext'をキャプチャしてください(私は' OnLaunched'イベントハンドラを使って行います)。そうでなければあなたがつかむコンテキストは役立たないでしょう。さらに読む:http://www.codeproject.com/Articles/31971/Understanding-SynchronizationContext-Part-I – Lvsti