在服务器上异步调用Web服务是否有意义?

时间:2014-08-13 14:09:17

标签: .net web-services asynchronous task

在我的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服务客户端是否阻止线程?如果是这样,我可以使用sync methoad:

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

由于

BTW:我使用的是ASP.NET MVC 4,面向.NET 4(因为我必须这样做)。对于async / await兼容性,我使用的是Microsoft.Bcl.Async库。

1 个答案:

答案 0 :(得分:1)

你是对的,使用异步IO可以&#34;保存&#34;一个线程在运行时。这是服务器上异步IO的主要优点。 I have written about the pros and cons of async IO before.(另外:https://stackoverflow.com/a/12796711/122718)。

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

另一方面,如果你不担心这一点,async将不会给你任何东西。您可以节省几MB可能不需要的堆栈内存。您还可以使用异步刻录更多CPU。你的工作效率会降低(特别是因为你现在需要让这个方法的所有调用者都异步。异步是病态的。)。