关闭WCF通道时遇SetPositionResponse意外消息错误,求优雅解决方法
解决方案:优雅关闭WCF通道避免意外输入消息错误
错误根源
你遇到的问题是:调用SetPosition后,通道尚未完成响应处理就被关闭,导致通道在接收响应时触发错误。即使是同步调用,也可能因WCF内部状态更新延迟,偶尔出现这种时序问题。
改进后的通道关闭逻辑
替换原finally块的代码,采用WCF标准的安全关闭流程,处理关闭时的异常,同时确保通道状态正确:
finally { var channel = Settings as ICommunicationObject; if (channel != null) { switch (channel.State) { case CommunicationState.Opened: try { channel.Close(); } catch (CommunicationException) { channel.Abort(); } catch (TimeoutException) { channel.Abort(); } catch (Exception) { channel.Abort(); throw; } break; case CommunicationState.Faulted: channel.Abort(); break; } } }
其他优化建议
- 异步调用必须等待完成:如果
SetPosition是异步方法(返回Task),一定要用await等待调用完成后再进入finally块,否则会出现未接收响应就关闭通道的情况:try { await Settings.SetPositionAsync(CHWKey, Angle); } finally { // 上述关闭逻辑 } - 复用通道减少开销:如果该通道需要频繁调用,建议复用通道实例(比如维护单例或通道池),而非每次调用后关闭。通道的创建和关闭有性能开销,也容易引发时序问题,统一在所有操作完成后再关闭更稳妥。
内容的提问来源于stack exchange,提问作者Or Rosenblum
相关产品推荐
相关产品推荐

