2014-09-12 125 views
3

我期待从另一个开发这些代码:异步操作立即等待

bool isValid = await engine.GetTaskByIdAsync(taskId); 
    if(isValid) 
    .... 

当我与async操作的工作,它是同时异步操作完成做独立的工作:

Task<bool> task = engine.GetTaskByIdAsync(taskId); 

    //Do work that doesn't need the "task" variable 

    bool completed = await task; 
    if(bool) 
    .... 

看来,第一个例子启动异步操作,然后立即开始等待。这里有一些价值,我不明白吗?

注意:此代码位于应用程序的数据访问层,因此不会与用户界面进行交互。

+0

当然,启动一个进程并立即返回,如果事先有逻辑,有什么关系? – 2014-09-12 19:04:40

+0

“看起来,第一个例子启动异步操作,然后立即开始等待” - await“使我们在继续之前等待呼叫完成。 – 2014-09-12 19:07:17

+0

你会怎么做那个程序员做的*没有*等待任务? – Servy 2014-09-12 19:07:57

回答

6

这里有一些价值我不明白吗?

绝对 - 这意味着,虽然你需要操作返回之前,你可以做任何更多的工作的价值,你不是当你等待它占用一个线程。如果你正在编写一个GUI,这一点尤其重要,因为绑定GUI线程基本意味着冻结UI。

这听起来像你正在关注异步的“并行处理多个事物”这一点,这很重要,但远不止于此。

+0

好点,我专门用网络工作,所以它不是我通常处理的事情。我在数据访问层找到了这个代码,所以很好奇,如果有什么东西需要从中获取。 – 2014-09-12 19:16:31

+1

@ChrisHardie Web应用程序仍然可以受益于异步。它可以允许Web请求在不执行CPU绑定工作时消耗线程池线程的时间,从而允许这些线程池线程为其他请求提供服务,从而允许服务器扩展它可以服务的可能的并发请求数。 – Servy 2014-09-12 19:23:19

+0

@Servy首先,提高可用于Web服务器的线程数是不是更好?添加await会引入开销,但不会奇迹般地增加系统可用的CPU周期数。虽然你在技术上是正确的,但我认为你最好是正确地调整你的网络服务器。 – AVee 2014-09-12 20:39:19

0

常犯的错误是等待块。它没有。

当前线程立即返回,并且当异步任务完成时,该函数的其余部分被注册为执行。