C# 具有.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; }

我已经在我的.NET 4.5应用程序中添加了一个WCF服务引用,使用“允许生成异步操作”下的默认“生成基于任务的操作”选项。我正在从我自己的异步方法调用该服务,有点像这样:

public async Task<SomeData> GetDataAsync()
{
    var client = new MyServiceClient();
    var result = await client.GetSomeDataAsync();

    return result;
}
调用按预期返回

我做错了什么?

我的,T先生。我强烈怀疑,在您的(客户端)调用堆栈上,您有一些代码正在调用
任务。结果
任务。等待
,这(正如我在博客上解释的)

默认情况下,
wait
a
Task
时,
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();