我有许多 Web 服务,当它们被调用时,它们需要在返回之前调用其他外部服务以获取信息。这一切都是同步完成的。
因此,如果我有一个返回电影列表的电影 GET 服务,Web 服务逻辑将等待电影提供者的外部服务返回数据,对其进行处理并为 GET 返回数据。
通过将外部服务调用包装在 Task 中并使用 async/await 模型会证明有什么好处吗?处理 GET 的初始线程是否仍然只是被阻塞等待响应,或者它是否会被释放以处理其他传入的服务调用?
我有许多 Web 服务,当它们被调用时,它们需要在返回之前调用其他外部服务以获取信息。这一切都是同步完成的。
因此,如果我有一个返回电影列表的电影 GET 服务,Web 服务逻辑将等待电影提供者的外部服务返回数据,对其进行处理并为 GET 返回数据。
通过将外部服务调用包装在 Task 中并使用 async/await 模型会证明有什么好处吗?处理 GET 的初始线程是否仍然只是被阻塞等待响应,或者它是否会被释放以处理其他传入的服务调用?
通过将外部服务调用包装在 Task 中并使用 async/await 模型会证明有什么好处吗?
包装同步调用可能不会提供太多好处 - 但如果外部服务也提供真正的异步 API,您可以获得显着的好处。
处理 GET 的初始线程是否仍然只是被阻塞等待响应,或者它是否会被释放以处理其他传入的服务调用?
我目前不知道 WCF 对异步的支持是什么样的,但应该可以编写所有这些,以便在有实际工作要做时只有任何线程处于活动状态......所以你可以处理数百个一次仅在几个线程上的请求。如果您的任何外部服务调用相对较慢,这一点尤其重要。
所以基本上,有收获,但你应该分别看两个方面:
这些方面中的每一个都可以提供好处,但如果这两个方面都得到完全支持,您将获得最大的好处 - 并最终得到最简单的代码。
通过将外部服务调用包装在 Task 中并使用 async/await 模型会证明有什么好处吗?
是的,假设您的 API 已经是异步的,例如,您可以轻松更改WebClient
为HttpClient
(或WebClient
异步使用),或者您可以将/方法包装到Begin
End
Task
.
您不想做的是将同步方法包装到Task.Run
. 这将用完一个线程,您将失去可伸缩性。
处理 GET 的初始线程是否仍然只是被阻塞等待响应,或者它是否会被释放以处理其他传入的服务调用?
初始线程将被释放以处理其他请求。
我有许多 Web 服务,当它们被调用时,它们需要在返回之前调用其他外部服务以获取信息。
这是async
/的理想情况,await
因为您通常可以同时执行请求:
public async Task<MyResult> GetAsync()
{
// Start several external requests simultaneously.
Task<Movie> getMovieTask = GetMovieAsync(...);
Task<Genre> getGenreTask = GetGenreAsync(...);
...
// Asynchronously wait for them all to complete.
await Task.WhenAll(getMovieTask, getGenreTask, ...);
var movie = await getMovieTask;
var genre = await getGenreTask;
...
// Build the result.
return ...;
}
在这种情况下,您可以对外部服务发出多个请求,并且当您await Task.WhenAll
排队时,您的请求没有使用线程。