2012-02-26 13 views
3

私は、ページが読み込まれたときにフォアグラウンドで実行するのではなく、バックグラウンドスレッドにデータ読み込み部分を置くことで、WP7アプリケーションのページのUIをよりレスポンシブにしようとしています。Windows Phone:Deployment.Current.Dispatcher.BeginInvokeが完了したときの通知方法

スレッドコードは基本的にいくつかのデータを処理し、観察可能なコレクションに項目を追加します。コレクションに項目の追加は、UIスレッドで実行されるように

Deployment.Current.Dispatcher.BeginInvoke(() => { _events.Add(_newItem); }); 

:例外の問題を避けるために、私は次のように実行します。

私が今打っている問題は、新しい項目を追加するのではなく新しい場所を挿入するために、コードの次の部分がforeachの foreachを実行する必要があるということです。残念ながら、私が見ているのは、UIスレッドがforeachループにいる間にAddを実行して、即座にforeachを壊すことがあるということです。

私が行った読書から、UIピースが完了するまでバックグラウンドスレッドをブロックするために、EndInvoke()を呼び出す方法があるようです。残念ながら、それはWp7/Silverlight実装がEndInvokeをサポートしていないようです。

foreachを開始する前にAddが完了していることを確認するための提案はありますか?

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

フィリップ

答えて

14

それは非常に簡単です。

// must be executed in background 
foreach (Item item in Items) 
{ 
    EventWaitHandle Wait = new AutoResetEvent(false); 
    Deployment.Current.Dispatcher.BeginInvoke(() => 
    { 
     _events.Add(_newItem); 
     Wait.Set(); 
    }); 
    // wait while item is added on UI 
    Wait.WaitOne(); 
} 
// here all items are added 

あなたが背景とUIスレッドの実行

を同期させる必要がある場所がどこででも使用することができます。このアプローチ)
関連する問題