Я пытаюсь узнать, необходимо ли закрыть ссылочный клиент услуг .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;
}
Я думал бы, что необходимо, по крайней мере, позвонить клиенту. Близко () в конце этого метода, и еще лучше переносят первую строку в оператор использования. Я просто хотел заставить некоторую обратную связь на этом узнавать, каковы лучшие практики.
Да, это так, но при этом нужно быть очень осторожным. При закрытии всего, что реализует ICommunicationObject
, существует вероятность того, что удаление объекта займет слишком много времени в случае ошибки или сбоя на канале.
Из-за этого предписывается, что вы вызываете метод Close
, а затем вызываете метод Dispose
на IDisposable
, используя ряд перехватывает определенные типы исключений и вызывает Abort
перед окончательным вызовом Dispose
.
Вы можете заключить эту логику в реализацию IDisposable
, которую можно использовать в операторе using
.
Ключевым моментом здесь является создание токена, который реализует IDisposable
, а затем в этой реализации вызовите Close
, перехватите соответствующие исключения, вызовите Abort
(если необходимо), а затем вызовите Dispose
.
Это реализовано как метод расширения, который возвращает на нем IDisposable
, что, в свою очередь, позволяет использовать его в операторе using
.
Лучше всего посмотреть на сгенерированный клиентский код для Dispose()
и посмотреть, действительно ли он избавляется от чего-либо, например, HTTP-соединений или чего-то еще.
С одной стороны, может быть просто интерфейс, который он реализует, наследует от IDisposable
, потому что какой-то клиент может должен что-то утилизировать, даже если этот конкретный интерфейс этого не делает. Это похоже на MemoryStream, класс, который реализует IDisposable
, потому что все Stream
это делают, но на самом деле это не имеет дела с неуправляемыми ресурсами.
С другой стороны, никогда не помешает использовать using
, даже если Dispose()
является пустым методом. И примеры MS на самом деле очень плохи о том, чтобы не использовать использовать
, даже если они должны (например, here), поэтому не воспите их пример как хорошее доказательство, которое вам не нужно.
Лучше всего, если класс реализует IDisposable, вызовите Dispose ()
в предложении finally
или заключите его в , используя ( ) {}
Edit
После комментария @casperOne ниже, кажется, что к клиентам WCF следует относиться более осторожно. Я не знал этого и немного обеспокоен этим, поскольку использование () до сих пор хорошо мне служило.