c# - 在使用后立即在 WCF ChannelFactory<T> 和 T channel 对象上调用 dispose 有多重要?

标签 c# .net wcf oop

开发人员喜欢编写尽可能简短的代码。我们在 C# 中调用 WCF 服务,想知道以下直觉是对还是错。 一种使用方式 ChannelFactory代码是:

var factory = new ChannelFactory<IService>("Endpoint");
var client = factory.CreateChannel();

client.DoSomething();

((IClientChannel)client).Close();
factory.Close();

另一种方式(更简洁)是使用一个实现了 IDisposable 的包装器对象(用于工厂和 channel )在 using block 中配置和使用:

using (ServiceWrapper<IService> svcWrapper = new ServiceWrapper<IService>("Endpoint")) {
    svcWrapper.Channel.DoSomething();
}

在这里,必须调用包装器的属性对于开发人员来说可能有点烦人。基本上也可以是:

using (ServiceWrapper<IService> svcWrapper = new ServiceWrapper<IService>("Endpoint")) {
    IService client = svcWrapper.Channel;
    client.DoSomething();
}

(我还发现this MSDN article说using block 可以隐藏异常)

开发人员可能更喜欢的是:

 IService client = new ServiceWrapper<IService>("Endpoint").Channel;
 client.DoSomething();

摘自《C# 5.0 简而言之》一书:

A popular pattern is to have the finalizer call Dispose. This makes sense when cleanup is non-urgent and hastening it by calling Dispose is more of an optimization than a necessity.

如果我将其添加到我的 ServiceWrapper (C# Finalize/Dispose 模式):

public void Dispose() {
    Dispose(true);
    GC.SuppressFinalize(this);
}

~ServiceWrapper() {
    Dispose(false);
}

然后GC最终会调用Dispose,做该做的事情。即:

public void Dispose(bool disposing) {
    if (disposing) {
        if (_channel != null) {
            ((IClientChannel)_channel).Close();
        }
        if (_factory != null) {
            _factory.Close();
        }

        _channel = null;
        _factory = null;
    }
}

我觉得这不是与 WCF 一起使用的好习惯 ChannelFactory<T>T channel ,但我没有一个很好的解释,这会吓跑开发人员使用它。你们能解释一下吗?

我不能说它不起作用,我试过了,它工作正常。我看不到任何明显的性能差异或类似... 除了“你不知道何时调用终结器。”我无法给出其他解释。 谢谢!

最佳答案

嗯,唯一的事 Dispose方法确实是显式关闭连接。就这些。您可以在 reference source 中亲自查看.另外, ClientBase<T> ,连接的基类做同样的事情。

就是说,如果您调用 Close你自己现在没有实际需要调用Dispose一点也不,尽管我认为你真的应该Dispose ,只是为了证明 future 。这也可以是发生错误时的故障保护,可能会阻止 Close被调用。

关于c# - 在使用后立即在 WCF ChannelFactory<T> 和 T channel 对象上调用 dispose 有多重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31647453/

相关文章:

c# - 如何从串口读取和写入

c# - Windows 窗体 : Progress Bar Unresponsive

c# - 错误 : Could not load file or assembly 'Microsoft. Practices.ServiceLocation,版本 = 1.0.0.0

c# - mscorlib.dll : Access to the path . 中发生类型为 'System.UnauthorizedAccessException' 的未处理异常。被拒绝

c# - 如何选择.NET版本来编译项目?

c# - 如何在 C# 中发现 onvif 设备

C# Selenium WebDriver FireFox 配置文件 - 使用带身份验证的代理

c# - 从类创建对象 ArrayList

asp.net-mvc - 如何通过模型的wcf服务层访问数据注释

c# - 某些方法的 WCF REST 基本身份验证