3

我有许多 Web 服务,当它们被调用时,它们需要在返回之前调用其他外部服务以获取信息。这一切都是同步完成的。

因此,如果我有一个返回电影列表的电影 GET 服务,Web 服务逻辑将等待电影提供者的外部服务返回数据,对其进行处理并为 GET 返回数据。

通过将外部服务调用包装在 Task 中并使用 async/await 模型会证明有什么好处吗?处理 GET 的初始线程是否仍然只是被阻塞等待响应,或者它是否会被释放以处理其他传入的服务调用?

4

2 回答 2

5

通过将外部服务调用包装在 Task 中并使用 async/await 模型会证明有什么好处吗?

包装同步调用可能不会提供太多好处 - 但如果外部服务也提供真正的异步 API,您可以获得显着的好处。

处理 GET 的初始线程是否仍然只是被阻塞等待响应,或者它是否会被释放以处理其他传入的服务调用?

我目前不知道 WCF 对异步的支持是什么样的,但应该可以编写所有这些,以便在有实际工作要做时只有任何线程处于活动状态......所以你可以处理数百个一次仅在几个线程上的请求。如果您的任何外部服务调用相对较慢,这一点尤其重要。

所以基本上,有收获,但你应该分别看两个方面:

  • 对您首先编写的 Web 服务类型的异步支持。你能用 WCF 中的异步方法来表达你的服务吗?
  • 您将调用的外部服务

这些方面中的每一个都可以提供好处,但如果这两个方面都得到完全支持,您将获得最大的好处 - 并最终得到最简单的代码。

于 2013-06-04T08:38:25.530 回答
2

通过将外部服务调用包装在 Task 中并使用 async/await 模型会证明有什么好处吗?

是的,假设您的 API 已经是异步的,例如,您可以轻松更改WebClientHttpClient(或WebClient异步使用),或者您可以将/方法包装到BeginEndTask.

不想做的是将同步方法包装到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排队时,您的请求没有使用线程。

于 2013-06-04T12:20:24.903 回答