c# - Windows Phone : how to tell when Deployment. Current.Dispatcher.BeginInvoke 已完成?

标签 c# windows-phone-7 begininvoke

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

线程代码本质上是处理一些数据并将项目添加到可观察的集合中;为了避免异常问题,我执行类似:

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

以便将项目添加到集合中是在 UI 线程中完成的。

我现在遇到的问题是代码的后续部分需要对集合执行 foreach 以确定在何处插入新项而不是仅仅添加它。不幸的是,我发现当我在 foreach 循环中时,UI 线程有时可以执行它的添加,立即中断 foreach。

根据我的阅读,似乎一种方法是调用 EndInvoke() 以阻塞后台线程,直到 UI 部分完成。不幸的是,Wp7/Silverlight 实现似乎不支持 EndInvoke。

关于如何在开始 foreach 之前检查添加是否已完成有什么建议吗?

谢谢。

菲利普

最佳答案

这很容易;)

// 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 线程执行的地方使用这种方法

关于c# - Windows Phone : how to tell when Deployment. Current.Dispatcher.BeginInvoke 已完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9453553/

相关文章:

c# - iTextsharp 横向文档

c# - 获取数据绑定(bind)项中的当前项

wpf - 对 Dispatcher.BeginInvoke() 的行为感到困惑

c# - 使用分隔符连接多个字符串

c# - 在 web 服务的生命周期内共享 web 服务变量?

c# - 将本地文件与 StringReader 一起使用

.net - Delegate.EndInvoke() 真的有必要吗?

c# - 为什么不调用此 C# 4.0 异步方法?

c# - 禁用标题栏 "X"- 关闭按钮

c# - 我的 WP7 对象在哪里?