Wrap the Run() loop in try/finally so cleanup (_running = false; ReleasePendingPrompt(null)) always executes, even if the injected lookup throws. Previously a throwing lookup escaped the loop and left any pending ReadLine() caller blocked forever. Also fold the lookup call into the same try/catch as the handler invocation so a bad command is swallowed without tearing down the reader loop. Document via XML comments that ReadLine() supports a single sequential caller (not concurrent callers) and that command handlers dispatched by Run() execute on the reader thread and must not call ReadLine(). Add a regression test proving a throwing lookup neither hangs a pending prompt nor kills the reader loop. Also drop an unused System.Text using from the test file. |
||
|---|---|---|
| .. | ||
| ConsoleInputHandler.cs | ||
| ConsoleInputPump.cs | ||
| HeadlessConsoleInputException.cs | ||