【问题标题】:WCF asynchronous call not returning dataWCF异步调用不返回数据
【发布时间】:2015-08-30 22:05:32
【问题描述】:

我有一个关于 WCF Web 服务方法的异步调用的问题。当使用 await 运算符调用时,它拒绝返回请求的对象。调用它的同步对应物就可以了,或者在它返回的 Task 对象上使用 Result 属性。它是从用作客户端的 WPF 应用程序的主线程调用的。我没有玩线程公寓,只是将所有内容都保留为生成的内容。
我真的不明白,我创建了一个简单的控制台测试应用程序,添加了相同的服务引用,异步调用工作得很好。 我正在使用 Visual Studio 2013。

    public async Task<GetComputerResponse> GetComputer(int computerId)
    {
        try
        {
            _client = new ServiceClient(_endpoint);
            _client.Open();

            GetComputerRequest request = new GetComputerRequest()
            {
                ComputerId = computerId
            };

            var result = await _client.GetComputerAsync(request); // the debugger seems to stop execution here, refuses to break at the very next line
            /* _client.GetComputer(request) or await _client.GetComputerAsync(request).Result work as expected */
            _client.Close();
            return result;
        }
        catch (Exception)
        {
            _client.Abort();
            return null;
        }
    }

我没有收到任何类型的错误,只是没有获取所需的数据。
提前谢谢你。

【问题讨论】:

  • 可以调试服务端吗?
  • @GlenThomas 是的,我可以。调试器可以很好地进入服务方法的(OperationContract 实现)主体,但在“return”语句之后它不会返回给客户端。我想要的值在服务器上,只是由于某种原因它永远不会到达客户端。

标签: c# wcf asynchronous


【解决方案1】:

添加对 ConfigureAwait 的调用并将 false 作为 continueOnCapturedContext 值传递似乎已经解决了问题。
它与从主 UI 线程调用异步代码导致死锁有关。至少快速研究是这样说的。很遗憾,目前我没有足够的时间了解更多信息。

var result = await _client.GetComputerAsync(request).ConfigureAwait(false);

【讨论】:

  • ConfigureAwait 是错误的解决方案。停止调用 Wait 或 Result。了解错误。另外,不要吞下错误。你在那里隐藏了错误。
猜你喜欢
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
相关资源
最近更新 更多