2011-02-03 5 views
4

現在の時刻を表示するテキストブロックを持つWPFアプリがあります。このテキストブロックは、ViewModelのDependencyPropertyにバインドされています。当然のことながら、私は時間を更新し続ける必要があるので、私はそうのようなタイマー(System.Threading.Timer)を使用:タイマーコールバックがWPFアプリを閉じます(DispatcherTimerは動作します)

public MainViewModel() 
{ 
    _dateTimer = new Timer(_dateTimer_Tick, null, 0, 60000); 
} 

void _dateTimer_Tick(object sender) 
{ 
    Time = DateTime.Now.ToString("HH:mm"); 
    Date = DateTime.Now.ToString("D"); 
} 

ことですが、コールバックが呼び出され、アプリケーションが終了...残念(出力を「時間のDPに書き込もうとしているときに、「WindowsBase.dllでSystem.InvalidOperationExceptionが発生しました」という最初のチャンスの例外があります)。

DispatcherTimerを使用すると、すべて正常に動作します。私はDispatcherTimerを使用しても構いません。アプリがかなり大きくて、できる限りパフォーマンスを調整したいと思っています。私が見る限り、私はUIスレッドにアクセスしていません(私はただプロパティを更新しています)ので、DispatcherTimerは必要ありません。

何か不足していますか?

ありがとうございました。

EDIT: 特性は次のように定義される:

public string Time 
    { 
     get { return (string)GetValue(TimeProperty); } 
     set { SetValue(TimeProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for Time. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty TimeProperty = 
     DependencyProperty.Register("Time", typeof(string), typeof(MainViewModel), new UIPropertyMetadata("")); 

+0

日付と時刻のプロパティはどのように定義されていますか? –

答えて

2

タイマコールバックはUIスレッドではないスレッド上で実行されているが、これは問題を引き起こす(日が同じです) ; 「プロパティを更新する」という事実にもかかわらず、このような呼び出しが一連の呼び出しを作成する、つまりプロパティの変更を関係者に通知するためです(この場合はUIです)スコープがバブルして、不適切なクロススレッドコールが発生します。この上で取得するには

、あなたはDispatcher.Invokeを使用し、その後、stateパラメータの引数としてタイマーのコンストラクタであなたのWindowDispatcherを指定することができます。例えば

...

public MainViewModel() 
{ 
    _dateTimer = new Timer(_dateTimer_Tick, Dispatcher, 0, 60000); 
} 

void _dateTimer_Tick(object state) 
{ 
    ((Dispatcher)state).Invoke(UpdateUI); 
} 

void UpdateUI() 
{ 
    Time = DateTime.Now.ToString("HH:mm"); 
    Date = DateTime.Now.ToString("D"); 
} 

EDIT:

DispatcherTimerを使用して、ヘンクによって提案され、さらには自分で考えられては、うまくしかし、ここに行くための方法かもしれない - 私は単にタイプを認識していなかったので、私の答えで実証する立場にありませんでした。 DispatcherTimerとパフォーマンスに関して、あなたの懸念はどのような根拠ですか?

+0

プロパティを更新すると、UIスレッドにアクセスすることができますか? –

+0

正しい説明ですが、アドバイスは次のようにする必要があります:DispatcherTimerを使用してください –

+0

私の答えが更新されました。 –

関連する問題