System.Net.Http.HttpClientและSystem.Net.Http.HttpClientHandlerใน. NET Framework 4.5 ใช้ IDisposable (ผ่านSystem.Net.Http.HttpMessageInvoker )
using
เอกสารคำสั่งพูดว่า:
ตามกฎแล้วเมื่อคุณใช้วัตถุ IDisposable คุณควรประกาศและสร้างอินสแตนซ์ในข้อความสั่งการใช้
คำตอบนี้ใช้รูปแบบนี้:
var baseAddress = new Uri("http://example.com");
var cookieContainer = new CookieContainer();
using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
{
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("foo", "bar"),
new KeyValuePair<string, string>("baz", "bazinga"),
});
cookieContainer.Add(baseAddress, new Cookie("CookieName", "cookie_value"));
var result = client.PostAsync("/test", content).Result;
result.EnsureSuccessStatusCode();
}
แต่ตัวอย่างที่ชัดเจนที่สุดจาก Microsoft จะไม่เรียกDispose()
อย่างชัดเจนหรือโดยปริยาย ตัวอย่างเช่น
- บทความบล็อกเดิมประกาศ relase ของ HttpClient
- เอกสาร MSDNจริงสำหรับ HttpClient
- BingTranslateSample
- GoogleMapsSample
- WorldBankSample
ในความคิดเห็นของประกาศมีคนถามพนักงานของ Microsoft:
หลังจากตรวจสอบตัวอย่างของคุณฉันเห็นว่าคุณไม่ได้ทำการดำเนินการจัดการกับอินสแตนซ์ HttpClient ฉันใช้ HttpClient ทุกอินสแตนซ์กับการใช้คำสั่งบนแอปของฉันและฉันคิดว่ามันเป็นวิธีที่ถูกต้องเนื่องจาก HttpClient ใช้อินเทอร์เฟซ IDisposable ฉันอยู่บนเส้นทางที่ถูกต้องหรือไม่?
คำตอบของเขาคือ:
โดยทั่วไปนั้นถูกต้องแม้ว่าคุณจะต้องระวังด้วย "การใช้" และ async เพราะพวกเขาไม่ได้ 'ผสมใน. สุทธิ 4, ใน. Net 4.5 คุณสามารถใช้ "คอย" ภายในคำสั่ง "การใช้"
แต่คุณสามารถนำ HttpClient มาใช้ซ้ำได้บ่อยเท่าที่คุณต้องการโดยทั่วไปแล้วคุณจะไม่สร้าง / กำจัดพวกเขาตลอดเวลา
ย่อหน้าที่สองไม่จำเป็นสำหรับคำถามนี้ซึ่งไม่เกี่ยวข้องกับจำนวนครั้งที่คุณสามารถใช้อินสแตนซ์ HttpClient แต่ถ้าจำเป็นต้องกำจัดมันหลังจากที่คุณไม่ต้องการมันอีกต่อไป
(อัปเดต: ในความจริงแล้วย่อหน้าที่สองเป็นกุญแจสำคัญของคำตอบตามที่ระบุไว้ด้านล่างโดย @DPeden)
ดังนั้นคำถามของฉันคือ:
จำเป็นหรือไม่เนื่องจากการใช้งานปัจจุบัน (.NET Framework 4.5) เพื่อเรียก Dispose () บนอินสแตนซ์ HttpClient และ HttpClientHandler การชี้แจง: โดย "จำเป็น" ฉันหมายถึงหากมีผลกระทบด้านลบใด ๆ จากการไม่จำหน่ายเช่นการรั่วไหลของทรัพยากรหรือความเสี่ยงต่อการเสียหายของข้อมูล
หากไม่จำเป็นก็จะเป็น "แนวปฏิบัติที่ดี" เนื่องจากพวกเขาใช้ IDisposable หรือไม่
หากจำเป็น (หรือแนะนำ) รหัสนี้มีการกล่าวถึงข้างต้นในการนำไปใช้อย่างปลอดภัย (สำหรับ. NET Framework 4.5) หรือไม่
หากคลาสเหล่านี้ไม่ต้องการการโทร Dispose () ทำไมถึงถูกใช้เป็น IDisposable
หากพวกเขาต้องการหรือถ้าเป็นแนวทางปฏิบัติที่แนะนำ Microsoft มีตัวอย่างที่ทำให้เข้าใจผิดหรือไม่ปลอดภัยหรือไม่?
Flush
หนึ่งหลังจากทุกการเขียนและอื่น ๆ นอกเหนือจากความไม่สะดวกของมันอย่างต่อเนื่องเพื่อเก็บทรัพยากรพื้นฐานนานกว่าที่จำเป็นสิ่งที่จะไม่เกิดขึ้นที่จำเป็นสำหรับ "พฤติกรรมที่ถูกต้อง"?