在检查状态(单线程)之后,WCF通道是否可能出现故障?

本文关键字:是否 故障 通道 WCF 状态 检查 单线程 之后 | 更新日期: 2023-09-27 18:17:09

我一直以这种方式处理通道的关闭和终止:

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();
            }
         }
    }
}

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

在检查状态(单线程)之后,WCF通道是否可能出现故障?

是的,该状态是您获取当前状态时的"快照"。在访问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为Faulted时就会失败),则调用Abort以确保正确清除。