Windows Phone:如何判断Deployment.Current.Dispatcher.BeginInvoke何时完成?

Phi*_*mer 3 c# begininvoke windows-phone-7

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

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

Deployment.Current.Dispatcher.BeginInvoke(() => { _events.Add(_newItem); });
Run Code Online (Sandbox Code Playgroud)

以便在UI线程中将项添加到集合中.

我现在遇到的问题是代码的后续部分需要对集合执行foreach,以便找出插入新项目的位置而不是仅添加它.不幸的是,我发现的是,当我处于foreach循环中时,UI线程有时可以执行其Add,立即打破foreach.

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

有关如何在开始使用foreach之前检查添加是否已完成的任何建议?

谢谢.

菲利普

Ku6*_*opr 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
Run Code Online (Sandbox Code Playgroud)

这种方法可以在任何需要同步后台和UI线程执行的地方使用