gpt4 book ai didi

c# - WCF channel 是否有可能在检查状态(单线程)后立即出错?

转载 作者:太空狗 更新时间:2023-10-29 23:39:37 27 4
gpt4 key购买 nike

我一直以这种方式处理 channel 的关闭和中止:

public async Task<MyDataContract> GetDataFromService()
{
IClientChannel channel = null;
try
{
IMyContract contract = factory.CreateChannel(address);
MyDataContract returnValue = await player.GetMyDataAsync();
channel = (IClientChannel);
return returnValue;
}
catch (CommunicationException)
{
// ex handling code
}
finally
{
if (channel != null)
{
if (channel.State == CommunicationState.Faulted)
{
channel.Abort();
}
else
{
channel.Close();
}
}
}
}

假设只有一个线程使用 channel 。我们如何知道 channel 在检查状态后不会立即发生故障?如果发生这种情况,代码将尝试 Close() 并且 Close() 将在 finally block 中抛出异常。解释为什么这是安全的/不安全的,并提供更好、更安全的方法的示例。

最佳答案

是的,状态是您获取当前状态时的“快照”。在您访问 CommunicationState 和您根据它做出逻辑决定之间的时间里,状态很容易改变。更好的 WCF 模式是:

try
{
// Open connection
proxy.Open();

// Do your work with the open connection here...
}
finally
{
try
{
proxy.Close();
}
catch
{
// Close failed
proxy.Abort();
}
}

这样您就不会依赖状态来做出决定。您尝试做最有可能的事情(健康关闭),如果失败(当 CommunicationState 出现故障时它会失败),您调用 Abort 以确保正确清理。

关于c# - WCF channel 是否有可能在检查状态(单线程)后立即出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16928905/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com