C# 具有.NET 4.5基于任务的异步操作的WCF服务客户端,等待永不返回
我已经在我的.NET 4.5应用程序中添加了一个WCF服务引用,使用“允许生成异步操作”下的默认“生成基于任务的操作”选项。我正在从我自己的异步方法调用该服务,有点像这样:C# 具有.NET 4.5基于任务的异步操作的WCF服务客户端,等待永不返回,c#,.net,wcf,async-await,C#,.net,Wcf,Async Await,我已经在我的.NET 4.5应用程序中添加了一个WCF服务引用,使用“允许生成异步操作”下的默认“生成基于任务的操作”选项。我正在从我自己的异步方法调用该服务,有点像这样: public async Task<SomeData> GetDataAsync() { var client = new MyServiceClient(); var result = await client.GetSomeDataAsync(); return result; }
public async Task<SomeData> GetDataAsync()
{
var client = new MyServiceClient();
var result = await client.GetSomeDataAsync();
return result;
}
调用按预期返回
我做错了什么?我的,T先生。我强烈怀疑,在您的(客户端)调用堆栈上,您有一些代码正在调用任务。结果或任务。等待,这(正如我在博客上解释的)
默认情况下,wait
aTask
时,wait
将捕获一个“上下文”,并使用该上下文恢复async
方法。如果这是一个类似于UI线程上下文的上下文,然后代码阻塞UI线程(即调用Result
或Wait
),则async
方法无法在该UI线程上恢复
我知道谁会尝试混合同步和异步代码。只需使用(正如我在MSDN文章中所描述的)。您如何知道您的等待声明永远不会完成?在您的示例中,您只是返回结果。您可以尝试在wait语句之后放置一条语句,以尝试访问result.result属性,查看其中是否有任何内容。return语句永远不会执行。我设置了一个断点并尝试逐步完成等待,但它从未继续。您的调用代码只是开始任务,您没有显示如何观察其结果。这很重要。几乎不得不否决你所有的T先生推荐信你的蜘蛛般的感觉死定了!在我的“上游”代码中,我肯定在做一个GetDataAsync().Result
——我调用.Result
的方法是基类方法的非异步重写,我不确定如何绕过这个限制。我会检查您答案中的链接,并以正确的方式完成此操作…是的,我完全错过了T先生的参考资料…;-)基类方法的非异步重写是一个问题。如果可能的话,我想让基类方法返回一个任务
;同步实现可以返回任务。FromResult
@Mr.T:由于您在ASP.NET上,我建议您使用同步服务调用,而不是任务。运行。也。
var result = client.GetSomeData();