我试图通过将数据加载部分放入后台线程而不是在页面加载时在前台运行,从而提高WP7应用程序中页面的UI响应能力。
线程代码本质上通过一些数据工作,并将项添加到可观察的集合中;为了避免异常问题,我执行以下操作:
Deployment.Current.Dispatcher.BeginInvoke(() => { _events.Add(_newItem); });以便在UI线程中完成将项添加到集合中。
我现在遇到的问题是,代码的后续部分需要在集合上执行foreach,以便找到插入新项的位置,而不仅仅是添加它。不幸的是,我发现UI线程有时可以在我处于foreach循环时执行其Add,从而立即破坏foreach。
从我完成的阅读来看,似乎有一种方法是调用EndInvoke()来阻塞后台线程,直到UI部分完成为止。不幸的是,Wp7/Silverlight实现似乎不支持EndInvoke。
对于如何在开始前检查添加是否已经完成,有什么建议吗?
谢谢。
菲利普
发布于 2012-02-26 14:18:06
这很容易;)
// 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线程执行的地方使用。
https://stackoverflow.com/questions/9453553
复制相似问题