คำถามติดแท็ก dispose

ดำเนินงานที่กำหนดโดยแอปพลิเคชันที่เกี่ยวข้องกับการปลดปล่อยการปล่อยหรือการรีเซ็ตทรัพยากรที่ไม่มีการจัดการ


15
จบลงด้วยการกำจัด
ทำไมบางคนถึงใช้Finalizeวิธีนี้มากกว่าDisposeวิธี? ในสถานการณ์ใดบ้างที่คุณจะใช้Finalizeวิธีนี้เหนือDisposeวิธีการและในทางกลับกัน
215 c#  dispose 

10
ฉันควรกำจัด () ชุดข้อมูลและ DataTable หรือไม่
ชุดข้อมูลและ DataTable ใช้ทั้ง IDisposable ดังนั้นโดยวิธีปฏิบัติที่ดีที่สุดฉันควรเรียกวิธีการ Dispose () ของพวกเขา อย่างไรก็ตามจากสิ่งที่ฉันอ่านจนถึงขณะนี้ชุดข้อมูลและ DataTable ไม่มีทรัพยากรที่ไม่มีการจัดการดังนั้น Dispose () ไม่ได้ทำอะไรมากจริงๆ นอกจากนี้ฉันไม่สามารถใช้using(DataSet myDataSet...)เพราะชุดข้อมูลมีคอลเลกชัน DataTables ดังนั้นเพื่อความปลอดภัยฉันต้องทำซ้ำผ่าน myDataSet.Tables กำจัดแต่ละ DataTables จากนั้นกำจัด DataSet ดังนั้นมันจึงคุ้มค่าที่จะโทรหา Dispose () ใน DataSets และ DataTables ของฉันทั้งหมดหรือไม่ ภาคผนวก: สำหรับผู้ที่คิดว่าควรกำจัดชุดข้อมูล: โดยทั่วไปแล้วรูปแบบการกำจัดคือการใช้งานusingหรือtry..finallyเนื่องจากคุณต้องการรับประกันว่าจะเรียก Dispose () อย่างไรก็ตามสิ่งนี้ได้รับความรวดเร็วอย่างน่าเกลียดสำหรับคอลเลกชัน ตัวอย่างเช่นคุณจะทำอย่างไรหากหนึ่งในสายที่จะทิ้ง () โยนข้อยกเว้น? คุณกลืน (ซึ่งเป็น "เลว") เพื่อที่คุณจะสามารถกำจัดองค์ประกอบต่อไปได้หรือไม่ หรือคุณแนะนำให้ฉันโทร myDataSet.Dispose () และลืมเกี่ยวกับการทิ้ง DataTables ใน …


9
พนักงานเก็บขยะจะโทรหา IDisposable ทิ้งให้ฉันไหม
NET IDisposable Pattern หมายความว่าหากคุณเขียน Finalizer และใช้ IDisposable โปรแกรมสุดท้ายของคุณจะต้องเรียก Dispose อย่างชัดเจน นี่เป็นเหตุผลและเป็นสิ่งที่ฉันทำมาโดยตลอดในสถานการณ์ที่หายากซึ่งมีการรับประกันขั้นสุดท้าย อย่างไรก็ตามจะเกิดอะไรขึ้นถ้าฉันทำสิ่งนี้: class Foo : IDisposable { public void Dispose(){ CloseSomeHandle(); } } และอย่าใช้โปรแกรมปิดท้ายหรืออะไรเลย เฟรมเวิร์กจะเรียกเมธอด Dispose ให้ฉันหรือไม่ ใช่ฉันรู้ว่านี่ฟังดูโง่และตรรกะทั้งหมดก็บอกเป็นนัยว่ามันจะไม่เกิดขึ้น แต่ฉันมักจะมี 2 สิ่งที่ด้านหลังศีรษะซึ่งทำให้ฉันไม่แน่ใจ เมื่อสองสามปีก่อนเคยบอกฉันว่ามันจะทำได้จริงและคน ๆ นั้นมีประวัติที่มั่นคงมากว่า "รู้เรื่องของพวกเขา" คอมไพเลอร์ / เฟรมเวิร์กทำสิ่ง 'เวทมนตร์' อื่น ๆ ขึ้นอยู่กับอินเทอร์เฟซที่คุณใช้ (เช่น foreach, extension method, serialization ตามคุณสมบัติ ฯลฯ ) …

7
คุณจะป้องกัน IDisposable จากการแพร่กระจายไปยังชั้นเรียนทั้งหมดของคุณได้อย่างไร
เริ่มด้วยคลาสที่เรียบง่ายเหล่านี้ ... สมมติว่าฉันมีชุดเรียนที่เรียบง่ายเช่นนี้: class Bus { Driver busDriver = new Driver(); } class Driver { Shoe[] shoes = { new Shoe(), new Shoe() }; } class Shoe { Shoelace lace = new Shoelace(); } class Shoelace { bool tied = false; } BusมีDriverที่DriverมีสองShoes แต่ละมีShoe Shoelaceทั้งหมดโง่มาก เพิ่มวัตถุ IDisposable ใน Shoelace ต่อมาฉันตัดสินใจว่าการดำเนินการบางอย่างเกี่ยวกับShoelaceอาจเป็นหลายเธรดดังนั้นฉันจึงเพิ่มEventWaitHandleสำหรับเธรดที่จะสื่อสารด้วย …

3
ถือว่าเป็นที่ยอมรับหรือไม่ที่จะไม่เรียก Dispose () บนวัตถุ TPL Task
ฉันต้องการทริกเกอร์งานให้ทำงานบนเธรดพื้นหลัง ฉันไม่อยากรอให้งานเสร็จ ใน. net 3.5 ฉันจะทำสิ่งนี้: ThreadPool.QueueUserWorkItem(d => { DoSomething(); }); ใน. net 4 TPL เป็นวิธีที่แนะนำ รูปแบบทั่วไปที่ฉันเห็นแนะนำคือ: Task.Factory.StartNew(() => { DoSomething(); }); อย่างไรก็ตามStartNew()วิธีการส่งกลับวัตถุซึ่งการดำเนินการTask IDisposableดูเหมือนว่าคนที่แนะนำลายนี้จะมองข้ามไป เอกสาร MSDN เกี่ยวกับTask.Dispose()วิธีการกล่าวว่า: "โทรหา Dispose ทุกครั้งก่อนที่คุณจะปล่อยการอ้างอิงล่าสุดของคุณไปที่งาน" คุณไม่สามารถเรียกทิ้งในงานได้จนกว่าจะเสร็จสิ้นดังนั้นการรอเธรดหลักและเรียกใช้การกำจัดจะทำให้จุดที่ต้องทำบนเธรดพื้นหลังตั้งแต่แรก ดูเหมือนว่าจะไม่มีเหตุการณ์ที่เสร็จสมบูรณ์ / เสร็จสิ้นที่สามารถใช้ในการล้างข้อมูลได้ หน้า MSDN ในคลาสงานไม่แสดงความคิดเห็นเกี่ยวกับเรื่องนี้และหนังสือ "Pro C # 2010 ... " แนะนำรูปแบบเดียวกันและไม่แสดงความคิดเห็นเกี่ยวกับการกำจัดงาน ฉันรู้ว่าถ้าฉันปล่อยทิ้งไว้โปรแกรมสุดท้ายจะจับมันได้ในที่สุด แต่นี่จะกลับมากัดฉันเมื่อฉันทำงานหนักและลืมงานแบบนี้และเธรด Finalizer ท่วมท้นหรือไม่? ดังนั้นคำถามของฉันคือ: ก็เป็นที่ยอมรับที่จะไม่เรียกDispose()ในTaskระดับในกรณีนี้หรือไม่? …

7
การกำจัดการควบคุมผู้ใช้ WPF
ฉันได้สร้างการควบคุมผู้ใช้ WPF แบบกำหนดเองซึ่งมีวัตถุประสงค์เพื่อใช้โดยบุคคลที่สาม การควบคุมของฉันมีสมาชิกส่วนตัวซึ่งเป็นแบบใช้แล้วทิ้งและฉันต้องการให้แน่ใจว่าวิธีการกำจัดจะถูกเรียกใช้เสมอเมื่อปิดหน้าต่าง / แอปพลิเคชันที่มีอยู่ อย่างไรก็ตาม UserControl ไม่สามารถใช้แล้วทิ้ง ฉันลองใช้อินเทอร์เฟซ IDisposable และสมัครรับเหตุการณ์ Unloaded แต่ไม่ได้รับการเรียกเมื่อแอปพลิเคชันโฮสต์ปิด ถ้าเป็นไปได้ฉันไม่ต้องการพึ่งพาผู้บริโภคในการควบคุมของฉันที่จำเรียกวิธีการกำจัดเฉพาะ public partial class MyWpfControl : UserControl { SomeDisposableObject x; // where does this code go? void Somewhere() { if (x != null) { x.Dispose(); x = null; } } } ทางออกเดียวที่ฉันพบจนถึงตอนนี้คือสมัครรับเหตุการณ์ ShutdownStarted ของผู้มอบหมายงาน นี่เป็นแนวทางที่สมเหตุสมผลหรือไม่? this.Dispatcher.ShutdownStarted …
119 c#  .net  wpf  user-controls  dispose 

5
มีวิธีใดในการปิด StreamWriter โดยไม่ต้องปิด BaseStream หรือไม่
ปัญหาหลักของฉันคือเมื่อusingเรียกDisposeใช้ a StreamWriterมันจะกำจัดBaseStream(ปัญหาเดียวกันกับClose) ฉันมีวิธีแก้ปัญหานี้ แต่อย่างที่คุณเห็นมันเกี่ยวข้องกับการคัดลอกสตรีม มีวิธีใดบ้างที่ทำได้โดยไม่ต้องคัดลอกสตรีม จุดประสงค์ของสิ่งนี้คือการรับเนื้อหาของสตริง (เดิมอ่านจากฐานข้อมูล) ไปยังสตรีมดังนั้นส่วนประกอบของบุคคลที่สามจึงสามารถอ่านสตรีมได้ หมายเหตุ : ฉันไม่สามารถเปลี่ยนองค์ประกอบของบุคคลที่สามได้ public System.IO.Stream CreateStream(string value) { var baseStream = new System.IO.MemoryStream(); var baseCopy = new System.IO.MemoryStream(); using (var writer = new System.IO.StreamWriter(baseStream, System.Text.Encoding.UTF8)) { writer.Write(value); writer.Flush(); baseStream.WriteTo(baseCopy); } baseCopy.Seek(0, System.IO.SeekOrigin.Begin); return baseCopy; } ใช้เป็น public void Noddy() { System.IO.Stream …
117 c#  stream  dispose 

5
จะเกิดอะไรขึ้นถ้าฉันกลับมาก่อนสิ้นสุดการใช้งานคำสั่ง? จะเรียกขายทิ้งหรือไม่
ฉันมีรหัสต่อไปนี้ using(MemoryStream ms = new MemoryStream()) { //code return 0; } dispose()วิธีการที่เรียกว่าในตอนท้ายของusingคำสั่งวงเล็บ}ใช่มั้ย? เนื่องจากฉัน returnก่อนสิ้นสุดusingคำสั่งMemoryStreamวัตถุจะถูกกำจัดอย่างถูกต้องหรือไม่? เกิดอะไรขึ้นที่นี่?

7
อะไรคือความแตกต่างระหว่างการใช้ IDisposable vs a destructor ใน C #?
เมื่อไหร่ที่ฉันจะใช้ IDispose ในคลาสซึ่งตรงข้ามกับ destructor ฉันอ่านบทความนี้แต่ฉันยังไม่เข้าใจประเด็นนี้ สมมติฐานของฉันคือถ้าฉันใช้ IDispose กับวัตถุฉันสามารถ 'ทำลาย' มันได้อย่างชัดเจนแทนที่จะรอให้คนเก็บขยะทำ ถูกต้องหรือไม่ นั่นหมายความว่าฉันควรเรียก Dispose on an object อย่างชัดเจนเสมอหรือไม่? ตัวอย่างทั่วไปของสิ่งนี้มีอะไรบ้าง?
101 c#  .net  dispose  destructor 

7
เราจะทราบได้อย่างไรว่าการอ้างอิงวัตถุที่ระบุได้ถูกกำจัดทิ้งไป?
มีวิธีการหรือวิธีอื่นที่มีน้ำหนักเบาในการตรวจสอบว่ามีการอ้างอิงถึงวัตถุที่กำจัดทิ้งหรือไม่? PS - นี่เป็นเพียงความอยากรู้อยากเห็น (หลับให้สบายไม่ใช่รหัสการผลิต) ใช่ฉันรู้ว่าฉันสามารถจับได้ObjectDisposedExceptionเมื่อพยายามเข้าถึงสมาชิกของวัตถุ
88 c#  .net  dispose  idisposable 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.