我正试图设计一个在执行长时间运行的任务时保持响应的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
答案 0 :(得分:3)
async
不是魔术;它只是让你能够编写异步代码。特别是async
does not execute code on a background thread。您可以使用Task.Run
执行此操作。
您可能会发现我的async
/await
intro或MSDN 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的主体中),但我似乎无法管理它。