我试图通过将数据加载部分放入后台线程而不是在页面加载时在前台运行来使WP7应用程序中的页面UI更具响应性。
线程代码基本上通过一些数据工作,并将项添加到可观察集合中;为了避免异常问题,我执行类似的操作:
Deployment.Current.Dispatcher.BeginInvoke(() => { _events.Add(_newItem); });
以便在UI线程中将项添加到集合中。
我现在遇到的问题是,代码的后续部分需要对集合执行 foreach ,以便找出插入新项目的位置而不是仅添加它。不幸的是,我发现UI线程有时会在我处于foreach循环时执行其Add,立即打破foreach。
从我已经完成的阅读中,看起来一种方法是调用EndInvoke()以阻止后台线程,直到UI片段完成。不幸的是,看起来Wp7 / Silverlight实现不支持EndInvoke。
有关如何在开始使用foreach之前检查添加是否已完成的任何建议?
感谢。
菲利普
答案 0 :(得分: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线程执行的地方使用