簡體   English   中英

在WCF ChannelFactory上調用dispose有多重要 <T> 使用后立即使用T通道對象?

[英]How important is to call dispose on a WCF ChannelFactory<T> and T channel object right after usage?

開發人員喜歡盡可能簡短地編寫代碼。 我們在C#中調用WCF服務,並想知道以下直覺是對還是錯。 使用ChannelFactory代碼的一種方法是:

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

client.DoSomething();

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

其他方式(更清潔)是使用包裝器對象(用於工廠和通道)實現IDisposable ,其中兩者都配置並用於使用塊:

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

(我也發現這篇MSDN文章說使用塊可以隱藏異常)

開發人員可能更喜歡的是:

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

從Nutshell中的C#5.0一書:

一種流行的模式是讓終結器調用Dispose。 當清理非緊急並通過調用來加速它時,這是有道理的。更多的是優化而非必需。

如果我將它添加到我的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頻道一起使用,但我沒有一個很好的解釋,它會嚇跑開發人員使用它。 你能解釋一下嗎?

我不能說它不起作用,我試過它並且工作正常。 我看不出任何明顯的性能差異或類似的...我不能給出其他解釋而不是“你不知道何時調用終結器”。 謝謝!

好吧, Dispose方法唯一做的就是顯式關閉連接。 就這些。 您可以在參考源中看到自己。 此外, ClientBase<T> ,連接的基類也是如此。

也就是說,如果你自己打電話給Close目前根本沒有實際需要調用Dispose ,雖然我認為你真的應該Dispose ,以便將來證明。 此外,這可能是發生錯誤的故障保護,可能會阻止調用Close

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM