You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WCF调用问题:Completed事件在await后触发致Retour值为空求助

解决WCF服务调用中Completed事件滞后触发的问题

嘿,我太懂你现在的郁闷了——调用WCF服务时,明明用了await,结果Completed事件偏偏在你执行LbResulat.Text = s.Retour之后才触发,导致Retour值为空。这大概率是因为你混用了WCF的两种异步调用模式,咱们一步步捋清楚解决办法:

问题根源:异步模式混用

WCF服务通常会提供两种异步调用方式:

  • 基于事件的异步模式(EAP):比如YourMethodAsync()触发请求,搭配YourMethodCompleted事件接收结果,结果必须在事件回调里获取
  • 基于Task的异步模式:返回Task<T>的async方法,支持直接用await等待服务响应完成

你现在的问题核心就是同时用了这两种模式:await可能只是完成了请求的触发步骤,但WCF的EAP逻辑里,真正的服务响应要等到Completed事件触发才会返回,所以你在await之后直接读取Retour时,结果还没生成,自然是空的。

解决方案1:优先用Task-based async/await(推荐)

这是最简洁也最符合现代异步编程习惯的方式,步骤如下:

  1. 右键你的WCF服务引用 → 选择「配置服务引用」
  2. 在「异步模式」选项里勾选「生成基于Task的异步方法」,保存后重新生成服务引用
  3. 用下面的代码调用服务:
// 直接await Task方法,等待服务响应完成后再赋值
var serviceResponse = await yourWcfClient.TargetServiceMethodAsync(/* 传入你的参数 */);
LbResulat.Text = serviceResponse.Retour;

这种方式下,await会自动阻塞到服务返回结果,不需要再处理Completed事件,彻底避免时机问题。

解决方案2:纯EAP模式(不混用await)

如果必须依赖Completed事件,那就严格遵循EAP的执行流程,不要用await:

// 先订阅Completed事件,确保回调逻辑在结果返回后执行
yourWcfClient.YourMethodCompleted += (sender, e) =>
{
    if (e.Error == null)
    {
        // 事件触发时,结果已经就绪,直接赋值
        LbResulat.Text = e.Result.Retour;
    }
    else
    {
        // 别忘了处理服务调用失败的情况
        LbResulat.Text = $"调用出错:{e.Error.Message}";
    }
};

// 最后触发异步请求
yourWcfClient.YourMethodAsync(/* 传入你的参数 */);

这样就能保证只有当服务响应回来、Completed事件触发时,才会去读取并设置Retour值,不会再出现空值问题。

关键提醒

绝对要避免同时混用await和Completed事件,这两种模式的执行时序逻辑完全不同,混用必然会导致结果获取时机错误。优先选择Task-based的async/await,代码更干净,也更不容易踩坑。

内容的提问来源于stack exchange,提问作者Guillaume Durupt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:39:12