我正在尝试在Windows Phone 8.1应用程序中实现任务类。在我的应用程序中,任务是知道用户是否按下了后退键,完成了由于网络而发生的任务或故障。为此,我正在使用任务类的continue with()方法。不知道是什么问题。帮助我。
代码:
await GetData(limit, offset).ContinueWith(t =>
{
//Console.WriteLine("task completed");
result = t.Result;
//throw new Exception("task 2 error");
}, TaskContinuationOptions.OnlyOnRanToCompletion).ContinueWith(t =>
{
//Console.WriteLine("task fault");
//throw new Exception("task 2 error");
}, TaskContinuationOptions.OnlyOnFaulted).ContinueWith(t =>
{
// Console.WriteLine("task cancelled");
//throw new Exception("task 2 error");
}, TaskContinuationOptions.OnlyOnCanceled);
);
我不知道问题是什么,所以需要帮助。
答案 0 :(得分:2)
如果您有ContinueWith
/ async
的访问权限,请勿使用await
。就这么简单。 ContinueWith
将允许您执行与新关键字相同的所有操作,但更难以阅读,理解,使用和维护。除非你真的真的必须这样做,否则不要使用它。
您的代码变为
try
{
result = await GetData(limit, offset);
}
catch(TaskCancelledException)
{
// GetData has been cancelled
// Console.WriteLine("task cancelled");
//throw new Exception("task 2 error");
}
catch(Exception)
{
//GetData has been faulted
//Console.WriteLine("task fault");
//throw new Exception("task 2 error");
}
现在了解你的意思要容易得多。
修改强>
这里似乎需要进一步澄清。从根本上使用await
关键字与使用ContinueWith
相同。它只允许您以更简洁易读的方式编写复杂的异步逻辑。
async Task DoAsyncWork()
{
var a = await GetAAsync();
Frob(a);
}
与
完全相同//Notice there is no async keword here
Task DoAsyncWork()
{
return GetAAsync().ContinueWith(t => Frob(t.Result),
TaskContinuationOptions.OnlyOnRanToCompletion);
}
同样,内部带有try/catch
的{{1}}块相当于await
,ContinueWith
和TaskContinuationOptions
展开的相当复杂的表达式。
如果您添加两个或更多AggregateException
或某些Tasks
链接的可能性,以及一些好的度量循环(if
,for
,它会变得复杂得多或foreach
,这并不重要)。如果你坚持使用你的while
枪,你会得到那种没有理智的人会想写的代码。那没关系,因为为你编写它是编译器的工作。编译器不是一个理智的人。所以,只要你能坚持到等待。
如果你不能使用ContinueWith
(显然不是你的情况,你正在为WP8编程),可以哭泣,因为你有很多潜在的伤害。一些扩展方法会让你的生活更轻松,但它仍然不会很漂亮。