使用Task.ContinueWith()作为事件形式" TaskEnded"是一种良好的做法。

时间:2014-11-20 23:22:24

标签: c# asynchronous task

Task没有可用于执行后续代码的已完成事件/方法。如果Task执行长时间运行的操作(例如从Web下载数据以更新本地数据库),那么使用方法Task.ContinueWith()执行完成的类似事件是否是一种良好的做法?这种方法可能会遇到任何不必要的副作用或问题吗?

1 个答案:

答案 0 :(得分:4)

可以使用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