-1
Task
没有可用于执行后续代码的完成事件/方法。如果Task
要执行长时间运行的操作(例如从Web上下载数据以更新本地数据库),那么使用方法Task.ContinueWith()
来执行完成的类似事件是否被认为是良好的做法?这种方法有没有不必要的副作用或问题?使用Task.ContinueWith()作为事件形式“TaskEnded”是否被认为是良好实践
Task
没有可用于执行后续代码的完成事件/方法。如果Task
要执行长时间运行的操作(例如从Web上下载数据以更新本地数据库),那么使用方法Task.ContinueWith()
来执行完成的类似事件是否被认为是良好的做法?这种方法有没有不必要的副作用或问题?使用Task.ContinueWith()作为事件形式“TaskEnded”是否被认为是良好实践
使用ContinueWith()
跟踪完成长时间运行是很好的。但是,从.NET 4.5开始,有一种更简洁的方式来编写它,即使用关键字async
/await
。例如:
using (var client = new HttpClient(...))
{
// long-running download operation, but UI remains responsive because
// the operation executes asynchronously
var response = await client.GetAsync();
// control resumes here once the above completes,
// returning control to the UI thread.
this.TextField.Text = "Download Complete!";
}
可以解释await
作为延续,即通常你会放在你的ContinueWith()
的东西后,无论发生什么事。 await
具有等待操作完成的效果,从返回的任务中解开结果并在当前上下文恢复执行 - 在本例中为UI线程。
这是执行长时间运行的I/O操作并且仍然具有响应式UI的好方法。您需要在async
方法中执行此操作 - 请参阅official documentation了解更多信息。
哦,我以为'await'阻止了执行。所以它返回给调用者,就好像这个方法已经完成了一样,然后当等待的'async'方法最终返回时,然后执行在异步调用的右下方的语句处继续执行,是吗? – 2014-11-21 00:05:50
'await'只允许UI在等待方法完成执行的同时继续处理。这就是你要找的@KauanRmk – techvice 2014-11-21 00:42:48
是的,确切的。等待的要点是允许长时间运行的操作在不阻塞当前上下文的情况下发生(本例中为UI线程)。这对于Windows Phone等平台来说尤为重要,因为对于UI可以阻塞的时间量有严格限制(如果我没有弄错,大约需要50毫秒)。 – Gigi 2014-11-21 07:58:11