5

我一直在以这种方式关闭和中止频道:

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 块中抛出异常。将不胜感激解释为什么这是安全/不安全的以及更好,更安全的方式的示例。

4

1 回答 1

2

是的,当你得到它时,状态是当前状态的“快照”。在您访问 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 以确保正确清理。

于 2013-06-04T23:37:05.600 回答