Start here. This is the direct spoken answer to practice first.
Why this question matters
Garbage collection reclaims managed memory but does not call asynchronous cleanup on demand. A resource that must flush, settle, or close through async I/O needs an owner that awaits that work on every exit path.
IAsyncDisposable represents deterministic cleanup that may need asynchronous work. Its DisposeAsync method returns a ValueTask, and await using awaits it even when the body exits through an exception. I use it when releasing an owned resource requires I/O, such as flushing an asynchronous stream or closing a protocol session. I do not add it to ordinary memory-only objects, and I do not expect the garbage collector to call it for me.