【发布时间】: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