【问题标题】:Does async calling of web service make sense on server?Web服务的异步调用在服务器上有意义吗?
【发布时间】:2014-08-13 14:09:17
【问题描述】:

在我的 Web 服务器 (ASP.NET MVC 4) 上,我正在另一台服务器上调用 Web 服务 (asmx)。我已经从 WSDL 生成了客户端。有同步方法和异步方法(回调,而不是任务)。

我将其转换为面向任务的调用(使用TaskCompletionSource),然后我像这样调用await

public async Task<DataObject> GetData()
{
    var tcs = new TaskCompletionSource<DataObject>();

    var client = new WebServiceClient();
    client.GetDataCompleted += (sender, args) => tcs.SetResult(args.Result);
    client.GetDataAsync();

    return await tcs.Task;
}

之后我在任何地方都使用async/await。这有道理吗?我认为当调用 Web 服务时,我会用这种方法保存一个线程 - 对吗?异步加载时 Web 服务客户端是否阻塞线程?如果是这样,我可以改用同步方法:

public DataObject GetData()
{
    var client = new WebServiceClient();
    return client.GetData();
}

谢谢

顺便说一句:我正在使用 ASP.NET MVC 4,目标是 .NET 4(因为我必须这样做)。对于async/await 的兼容性,我使用的是 Microsoft.Bcl.Async 库。

【问题讨论】:

  • 您不能在 ASP.NET 4.0 上使用 async/await(即使您使用的是 Microsoft.Bcl.Async 库),因为它们需要更新的 AspNetSynchronizationContext 仅可用在 ASP.NET 4.5 中。更多信息here.

标签: .net web-services asynchronous task


【解决方案1】:

你是对的,使用异步 IO 确实在运行时“保存”了一个线程。这是服务器上异步 IO 的主要优势。 I have written about the pros and cons of async IO before.(又名:https://stackoverflow.com/a/12796711/122718)。

你应该怎么做?如果该 Web 服务往往响应缓慢或有有时响应缓慢的风险,那么异步是非常有吸引力的。图像每秒有 10 个请求进入,Web 服务有 10 秒的延迟(可能是由于性能问题)。然后,您需要 100 个线程来处理该负载。

另一方面,如果您不担心这些,异步将不会给您任何帮助。您节省了几 MB 您可能不需要的堆栈内存。您还可以使用异步消耗更多 CPU。您的工作效率会降低(尤其是因为您现在还需要将此方法的所有调用者设为异步。异步是病毒式的。)。

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 2011-09-03
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多