diff --git a/src/core/iomgr/tcp_server_windows.c b/src/core/iomgr/tcp_server_windows.c
index 260948c76f8fbda0cc20e724fcdd057ec899e9db..0adbe9507c72b67bfbf796c6046f12dbb6f9655d 100644
--- a/src/core/iomgr/tcp_server_windows.c
+++ b/src/core/iomgr/tcp_server_windows.c
@@ -247,8 +247,12 @@ static void start_accept(server_port *port) {
 failure:
   if (port->shutting_down) {
     /* We are abandoning the listener port, take that into account to prevent
-       occasional hangs on shutdown. */
+       occasional hangs on shutdown. The hang happens when sp->shutting_down
+       change is not seen by on_accept and we proceed to trying new accept,
+       but we fail there because the listening port has been closed in the
+       meantime. */
     decrement_active_ports_and_notify(port);
+    return;
   }
   utf8_message = gpr_format_message(WSAGetLastError());
   gpr_log(GPR_ERROR, message, utf8_message);