【问题标题】:Update UI while running async REST call on windows phone 8在 Windows Phone 8 上运行异步 REST 调用时更新 UI
【发布时间】:2014-03-15 04:04:09
【问题描述】:

简而言之,我想显示进度指示器,进行 REST 服务调用,然后隐藏指示器。

我的进度指示器绑定到一个属性,当设置为真或假时,显示或隐藏它。我的指示器是一个小旋转轮,当我调用 Web 服务时,我显然不希望我的 UI 挂起,所以这是通过调用 Async 函数来完成的。

我之前发现了一些代码,可以很好地实现我想做的事情,但是有一个但是!

这是我正在使用的简化版本代码:

try
{
    ThreadPool.QueueUserWorkItem(async data =>
        {
            var dispatcher = Deployment.Current.Dispatcher;
            dispatcher.BeginInvoke(() =>
            {
                this.IsRunning = true;
            });

            configModel = LoginUser(loginId, password);

            dispatcher.BeginInvoke(() =>
            {
                this.IsRunning = false;
            });
        });
}
catch (Exception ex)
{
    IDialogService dialogService = this.GetService<IDialogService>();
    dialogService.Show("Unhandled Exception", ex.Message);
    dialogService = null;
}

当我的 Web 服务由于某种原因失败(例如被防火墙阻止)时,就会出现问题。即使我有一个 try catch,它也不会被捕获并导致我的应用程序崩溃。

有没有其他方法可以在不使用线程池的情况下实现这一点?实现这一目标的最干净的方法是什么?

我确实需要调用 this.IsRunning,因为它会在显示和隐藏我的进度指示器后进行处理,但这显然需要在 UI 线程上运行,而其余调用需要在另一个线程上运行。

【问题讨论】:

    标签: c# windows-phone-8 task-parallel-library async-await


    【解决方案1】:

    您需要尝试/捕获实际的服务调用,而不是 QueueUserWorkItem:

    try
    {
        configModel = LoginUser(loginId, password);
    }
    catch (...)
    {
    
    }
    
    dispatcher.BeginInvoke(() =>
    {
        this.IsRunning = false;
    });
    

    否则,您的IsRunning = false 将永远不会执行。

    但是

    如果您想要最干净的方式,那么您可以将 LoginUser 设为异步,以便您可以等待它。

    this.IsRunning = true;
    
    try
    {
        configModel = await LoginUser(loginId, password);
    }
    catch (...)
    {
        // report error here
    }
    
    this.IsRunning = false;
    

    【讨论】:

    • 看到你的回答我正要关闭这个!这正是我所拥有的(即最干净的方式)!当答案如此简单时,我不敢相信我浪费了这么多时间!我在我的脑海里,它必须比这更复杂!我不知道是 :) 还是 (: - 再次感谢!
    • 是的,C# 中的 async/await 是一种祝福。它保持一切整洁。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多