ความแตกต่างระหว่างการใช้และรอการใช้งานคืออะไร? และฉันจะตัดสินใจได้อย่างไรว่าจะใช้อันไหน


21

ฉันสังเกตเห็นว่าในบางกรณี Visual Studio แนะนำให้ทำเช่นนี้

await using var disposable = new Disposable();
// Do something

แทนสิ่งนี้

using var disposable = new Disposable();
// Do something

ความแตกต่างระหว่างusingและawait usingคืออะไร?

ฉันจะตัดสินใจได้อย่างไรว่าควรใช้อันไหน


3
ดูเหมือนว่าคุณสามารถใช้await usingกับ a เท่านั้นIAsyncDisposableและคุณสามารถใช้usingกับ a IDisposableเนื่องจากไม่มีสิ่งใดสืบทอดมาจากอีกอันหนึ่งได้ เวลาเดียวที่คุณสามารถใช้ได้คือถ้าคลาสรูปธรรมใช้ทั้งคู่และจากนั้นขึ้นอยู่กับว่าคุณกำลังเขียนโค้ดอะซิงโครนัสหรือไม่
juharr

คำตอบ:


31

การซิงค์แบบคลาสสิกโดยใช้

คลาสสิกที่ใช้เรียกDispose()วิธีการของวัตถุที่ใช้IDisposableอินเตอร์เฟซ

using var disposable = new Disposable();
// Do Something...

มีค่าเท่ากับ

IDisposable disposable = new Disposable();
try
{
    // Do Something...
}
finally
{
    disposable.Dispose();
}

ใหม่ async กำลังรอการใช้งาน

ใหม่รอการใช้การโทรและรอDisposeAsync()วิธีการของวัตถุที่ใช้IAsyncDisposableอินเตอร์เฟซ

await using var disposable = new AsyncDisposable();
// Do Something...

มีค่าเท่ากับ

IAsyncDisposable disposable = new AsyncDisposable();
try
{
    // Do Something...
}
finally
{
    await disposable.DisposeAsync();
}

IAsyncDisposable อินเตอร์เฟซที่ถูกเพิ่มเข้ามาในและ.NET Core 3.0.NET Standard 2.1

ใน. NET คลาสที่เป็นเจ้าของทรัพยากรที่ไม่มีการจัดการมักจะใช้อินเทอร์เฟซIDisposableเพื่อให้มีกลไกสำหรับการปล่อยทรัพยากรที่ไม่มีการจัดการพร้อมกัน อย่างไรก็ตามในบางกรณีพวกเขาจำเป็นต้องจัดเตรียมกลไกแบบอะซิงโครนัสสำหรับการปล่อยทรัพยากรที่ไม่ได้รับการจัดการเพิ่มเติมจาก (หรือแทน) แบบซิงโครนัส การจัดให้มีกลไกดังกล่าวช่วยให้ผู้บริโภคสามารถดำเนินการกำจัดทรัพยากรได้อย่างมากโดยไม่ต้องบล็อกเธรดหลักของแอปพลิเคชั่น GUI เป็นเวลานาน

กระบวนการIAsyncDisposable.DisposeAsyncของอินเทอร์เฟซนี้ส่งคืนValueTaskที่แสดงถึงการดำเนินการกำจัดแบบอะซิงโครนัส คลาสที่เป็นเจ้าของทรัพยากรที่ไม่มีการจัดการใช้วิธีการนี้และผู้บริโภคของคลาสเหล่านี้เรียกวิธีนี้บนวัตถุเมื่อไม่ต้องการอีกต่อไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.