0

我正在努力设计一个在执行长时间运行的任务时保持响应的 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

4

2 回答 2

3

async不是魔术;它只是让您能够编写异步代码。特别是,async 不在后台线程执行代码。您可以使用它Task.Run来执行此操作。

您可能会发现我的async/ awaitintroMSDN 文档很有帮助。

于 2012-12-06T23:17:20.247 回答
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 的主体)中捕获此异常,但我似乎无法管理它。

于 2012-12-08T02:23:40.800 回答