Windows Phone:如何知道Deployment.Current.Dispatcher.BeginInvoke何时完成?

3

我正在尝试通过将数据加载部分放入后台线程而不是在页面加载时在前台运行,来使WP7应用程序中的页面UI更加响应。

该线程代码基本上通过一些数据并将项目添加到可观察集合中; 为了避免异常问题,我执行类似以下内容:

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

这样可以确保将项目添加到集合中是在UI线程中完成的。

我现在遇到的问题是,代码的后续部分需要对集合执行foreach操作,以便确定在哪里插入新项目,而不仅仅是添加它。不幸的是,我发现UI线程有时会在我进行foreach循环时执行其添加,立即打破foreach循环。

从我所阅读的内容来看,一种方法是调用EndInvoke()以阻止后台线程直到UI部分完成。不幸的是,看起来Wp7/Silverlight实现不支持EndInvoke。

您有什么建议,可以在开始foreach之前检查是否已完成添加?

谢谢。

Philip

1个回答

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线程执行的任何地方使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接