Windows应用商店应用UI - 无响应

时间:2012-12-06 22:59:08

标签: windows-8

我正试图设计一个在执行长时间运行的任务时保持响应的UI。

为此,我在VS2012中创建了一个简单的应用程序,并将以下类添加到其中:

using System.Threading.Tasks;

namespace TaskTest
{
    class Class1
    {
        public async Task<int> Async()
        {
            //simulate a long running process
            for (long x = 0; x < long.MaxValue; x++) { }
            return 1;
        }
    }
}

然后我修改了主页面的LoadState()方法:

protected override async void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
{
    await DoLongRunningProcess();
}

private async Task DoLongRunningProcess()
{
    var id = 0;
    id = await new Class1().Async();
    await new MessageDialog(id + "").ShowAsync();
}

我希望页面在该进程执行时保持响应。但是,当我运行此代码时,页面需要很长时间才能加载。我做错了什么?

TIA

2 个答案:

答案 0 :(得分:3)

async不是魔术;它只是让你能够编写异步代码。特别是async does not execute code on a background thread。您可以使用Task.Run执行此操作。

您可能会发现我的async/await introMSDN documentation有帮助。

答案 1 :(得分:0)

这很有帮助。我做了以下更改,得到了我想要的结果:

class Class1
{
    public int Launch()
    {
        //throw new Exception("Class1 exception");
        for (var i = 0; i < int.MaxValue / 2; i++) ;
        return 1;
    }
}

...

protected async override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
{
    var task = DoLongRunningProcess();
    await task;
    await new MessageDialog(task.Result + "").ShowAsync();
}

private Task<int> DoLongRunningProcess()
{
    return Task.Run<int>(() => new Class1().Launch());
}

页面继续加载,短暂暂停后会显示消息对话框。但是,现在我需要知道如何捕获异常。如果我在方法Launch()中取消注释// throw new Exception ...行,则会将其报告为未处理的异常。我想在主UI线程中捕获此异常(即,在方法LoadState的主体中),但我似乎无法管理它。