diff --git a/livekit-rtc/livekit/rtc/room.py b/livekit-rtc/livekit/rtc/room.py
index 2221eb41..52a0e42f 100644
--- a/livekit-rtc/livekit/rtc/room.py
+++ b/livekit-rtc/livekit/rtc/room.py
@@ -13,6 +13,7 @@
 # limitations under the License.
 
 import asyncio
+import contextlib
 import ctypes
 import logging
 from dataclasses import dataclass, field
@@ -217,23 +218,25 @@ async def connect(
         self._task = self._loop.create_task(self._listen_task())
 
     async def disconnect(self) -> None:
-        if not self.isconnected():
-            return
+        try:
+            if self.isconnected():
+                req = proto_ffi.FfiRequest()
+                req.disconnect.room_handle = self._ffi_handle.handle  # type: ignore
 
-        req = proto_ffi.FfiRequest()
-        req.disconnect.room_handle = self._ffi_handle.handle  # type: ignore
+                queue = FfiClient.instance.queue.subscribe()
+                try:
+                    resp = FfiClient.instance.request(req)
+                    await queue.wait_for(
+                        lambda e: e.disconnect.async_id == resp.disconnect.async_id
+                    )
+                finally:
+                    FfiClient.instance.queue.unsubscribe(queue)
 
-        queue = FfiClient.instance.queue.subscribe()
-        try:
-            resp = FfiClient.instance.request(req)
-            await queue.wait_for(
-                lambda e: e.disconnect.async_id == resp.disconnect.async_id
-            )
+            if self._task is not None:
+                await self._task
         finally:
-            FfiClient.instance.queue.unsubscribe(queue)
-
-        await self._task
-        FfiClient.instance.queue.unsubscribe(self._ffi_queue)
+            if self._ffi_queue is not None:
+                FfiClient.instance.queue.unsubscribe(self._ffi_queue)
 
     async def _listen_task(self) -> None:
         # listen to incoming room events