Muss ich schließen .NET-service-Referenz client, wenn ich fertig bin, es zu benutzen
Ich bin versucht, herauszufinden, ob es nötig ist, Sie zu schließen .net-service-Referenz-client, wenn Sie fertig sind es zu benutzen. Fast alle Beispiele, die ich zufällig auf dem Netz scheint das nicht zu, aber der client, der generiert wird, implementiert IDisposable und da spielt es öffnen einer Verbindung zu einem Dienst, meine intuition sagt mir, Sie müssen schließen, die Verbindung herzustellen, wenn Sie fertig sind.
Hier ist ein Codebeispiel, die ich zog aus 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;
}
Ich würde denken, dass Sie sollte mindestens call-client.Close() am Ende dieser Methode, und noch besser wickeln Sie die erste Zeile in einer using-Anweisung. Ich wollte nur feedback bekommen auf diese, um herauszufinden, was die best practices sind.
InformationsquelleAutor der Frage nitramssirc | 2010-07-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, das tun Sie, aber Sie müssen sehr vorsichtig sein, wenn dies zu tun. Beim schließen alles, was implementiert
ICommunicationObject
besteht das Potenzial zu verursachen, die Entsorgung des Objekts, um eine übermäßige Menge an Zeit in dem Fall, dass ein Fehler oder eine Störung auf dem Kanal.Weil dieser, ist es vorgeschrieben, dass Sie rufen Sie die
Methode und rufen Sie dann die
Dispose
Methode aufIDisposable
mit einer Reihe von gesamtfangmengen für bestimmte exception-Typen und ruftAbbrechen
bevor Sie schließlich rufenDispose
.Umgebrochen werden kann diese Logik in einem
IDisposable
Implementierung, die Sie verwenden können, in einerusing
Anweisung, wie ich schon skizziert in einem blog-post in dieser Angelegenheit.Der Schlüssel hier ist, um ein token zu erstellen, die
IDisposable
und dann in die Umsetzung, rufen SieClose
fangen die entsprechenden Ausnahmen, rufen SieAbort
(wenn nötig) und dann rufen SieDispose
.Dies ist implementiert als eine Erweiterung Methode gibt eine
IDisposable
es, die wiederum ermöglicht es Ihnen, in einemusing
- Anweisung.InformationsquelleAutor der Antwort casperOne
Beste Praxis ist, wenn die Klasse IDisposable implementiert, rufen Sie
Dispose()
imfinally
- Klausel, oder wickeln Sie es mitusing () { }
Bearbeiten
Nach dem @ - casperOne Kommentar unten, es scheint, WCF-clients behandelt werden sollten vorsichtiger. Ich wusste das nicht, und ich bin ein wenig verunsichert, indem es, mit der Verwendung von() haben mir gute Dienste geleistet bisher.
InformationsquelleAutor der Antwort Neil Moss
Das beste, was zu tun ist, Blick auf die erzeugte client-code für
Dispose()
und sehen, ob es wirklich entsorgen, alles andere, wie HTTP-verbindungen oder so etwas.Auf der einen Seite, es kann auch einfach sein, dass das interface implementiert, erbt von
IDisposable
weil einige Kunden könnte entsorgen müssen etwas, auch wenn dieser spezielle nicht. Das ist ähnlich wie MemoryStreameine Klasse, dieIDisposable
weil alleStream
s tun, aber nicht, dass tatsächlich viel mit nicht verwaltete Ressourcen.Auf der anderen Seite, es schadet nie, es zu benutzen
using
auch wennDispose()
ist eine leere Methode. Und MS Beispiele sind eigentlich wirklich schlecht über nicht mitusing
auch wenn Sie (z.B. hier), also nicht nehmen, Ihre Beispiel gute Hinweise, dass Sie nicht brauchen, um.InformationsquelleAutor der Antwort