Сделайте я должен закрыть сервисный ссылочный клиент.NET, когда я сделан с помощью него

Я пытаюсь узнать, необходимо ли закрыть ссылочный клиент услуг .NET, когда Вы сделаны с помощью него. Почти все примеры, с которыми я столкнулся в сети, не кажутся, но клиент, который сгенерирован реализации IDisposable и так как это действительно открывает соединение с сервисом, моя интуиция говорит мне, что необходимо закрыть то соединение, когда Вы сделаны с ним.

Вот пример кода, который я вытянул из http://msdn.microsoft.com/en-us/library/bb386386 (v=VS.90) .aspx:

private void button1_Click(System.Object sender, System.EventArgs e)
{
    ServiceReference1.Service1Client client = new 
        ServiceReference1.Service1Client();
    string returnString;

    returnString = client.GetData(textBox1.Text);
    label1.Text = returnString;
}

Я думал бы, что необходимо, по крайней мере, позвонить клиенту. Близко () в конце этого метода, и еще лучше переносят первую строку в оператор использования. Я просто хотел заставить некоторую обратную связь на этом узнавать, каковы лучшие практики.

16
задан casperOne 11 January 2012 в 20:39
поделиться

3 ответа

Да, это так, но при этом нужно быть очень осторожным. При закрытии всего, что реализует ICommunicationObject , существует вероятность того, что удаление объекта займет слишком много времени в случае ошибки или сбоя на канале.

Из-за этого предписывается, что вы вызываете метод Close , а затем вызываете метод Dispose на IDisposable , используя ряд перехватывает определенные типы исключений и вызывает Abort перед окончательным вызовом Dispose .

Вы можете заключить эту логику в реализацию IDisposable , которую можно использовать в операторе using .

Ключевым моментом здесь является создание токена, который реализует IDisposable , а затем в этой реализации вызовите Close , перехватите соответствующие исключения, вызовите Abort (если необходимо), а затем вызовите Dispose .

Это реализовано как метод расширения, который возвращает на нем IDisposable , что, в свою очередь, позволяет использовать его в операторе using .

22
ответ дан 30 November 2019 в 21:45
поделиться

Лучше всего посмотреть на сгенерированный клиентский код для Dispose() и посмотреть, действительно ли он избавляется от чего-либо, например, HTTP-соединений или чего-то еще.

С одной стороны, может быть просто интерфейс, который он реализует, наследует от IDisposable, потому что какой-то клиент может должен что-то утилизировать, даже если этот конкретный интерфейс этого не делает. Это похоже на MemoryStream, класс, который реализует IDisposable, потому что все Stream это делают, но на самом деле это не имеет дела с неуправляемыми ресурсами.

С другой стороны, никогда не помешает использовать using, даже если Dispose() является пустым методом. И примеры MS на самом деле очень плохи о том, чтобы не использовать использовать , даже если они должны (например, here), поэтому не воспите их пример как хорошее доказательство, которое вам не нужно.

-2
ответ дан 30 November 2019 в 21:45
поделиться

Лучше всего, если класс реализует IDisposable, вызовите Dispose () в предложении finally или заключите его в , используя ( ) {}

Edit
После комментария @casperOne ниже, кажется, что к клиентам WCF следует относиться более осторожно. Я не знал этого и немного обеспокоен этим, поскольку использование () до сих пор хорошо мне служило.

4
ответ дан 30 November 2019 в 21:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: