2014-02-24 37 views
0

我期待更好地了解异步编程模型。让我们假设在下面称为Web服务需要1秒钟,返回:异步编程模型和应用程序规模

async Task<int> AccessTheWebAsync() 
{ 
    HttpClient client = new HttpClient(); 

    string urlContents = await client.GetStringAsync("http://service.com"); 

    return urlContents.Length; 
} 

它是正确的说,当await与异步方法使用当前线程产生回线程池的其他工作?是否使用异步模型为每个请求节省了1秒的工作时间,因为该线程并未等待Web服务响应?

+0

定义'节省1秒的工作'。每个请求都是一秒钟吗?多线程永远不会保存你的工作。同样的工作总是要进行。但是,它可以节省您的时间。 – Gusdor

+0

一般来说,这意味着线程可以用于其他工作。异步'GetStringAsync'方法使用异步I/O回调,所以它甚至不需要使用新线程。换句话说,在一个I/O绑定的应用程序中,拥有更多的线程根本没有帮助。异步调用'AccessTheWebAsync' 100次将意味着它将花费大约1秒钟的时间,而不是在一个线程中同步完成100秒。 – Luaan

+0

@Gusdor通过储蓄,我的意思是一个线程不会花费一些时间而不做有用的工作,因为它正在等待某些事情做出回应。 –

回答

2

说当await与异步方法一起使用时,当前线程返回到线程池进行其他工作是否正确?

是。

是否使用异步模型为每个请求节省了1秒的工作时间,因为该线程并没有围绕等待Web服务响应?

它释放了本来会被阻塞的那一秒的线程。

这从单个请求的角度来看没有区别;请求仍然需要等待操作完成,并且请求不关心它是同步等待(块)还是异步等待(等待)。但是,从服务器应用程序的角度来看,它有所不同:处理大量请求所需的线程数量较少。

2

调用线程在调用await语句时立即返回。如果你在一个上下文线程(一个UI或ASP.net线程)上,那么行为是不同的,但结果大致相同。

如果没有其他代码跟在后面,线程将只返回到池,并且vcalling线程实际上是一个线程池线程。

0

我曾尝试在WebApi中使用asyncawait调用。发生什么事是,当你到达await声明时,控制权给予调用方法unitl,任务(在这种情况下为client.GetStringAsync("http://service.com"))已完成。这是一个问题,因为调用方法试图返回一个值,而不管任务的完成,如果任务是完成,你会得到一个异常,像

一个返回语句被称为异步任务仍在进行中

在你的情况,因为你只有一个操作,即从另一个站点获取内容,你不需要它是异步。如果您从两个或更多独立站点获取内容,那么使用异步调用是有意义的。