Dein Code ist nicht falsch, er kehrt nur nie zurück, da die Objekte auf die Abfrage nicht anworten bzw. nicht/nie bereit sind, um die Anfrage abzuarbeiten.
Da ganze in Threads auszulagern verschiebt nur das Problem (da hilft auch kein CancelIoEx). Wenn du den Thread beendest und die Anfrage doch noch zurückkehrt, dann zeigen die Pointer auf einen nicht mehr gültigen Speicherbereich. Eigentlich sollte das kein Problem sein - aber in der Praxis kommt es zu Problemen mit Kernel-Komponenten (Treiber, Filter, Viren-Scanner), was im schlimmsten Fall zu BSODs führt.
Zudem ist es in der Praxis schwierig, _jedes_ "Datei"-
Handle abzufragen. Durch die Anfrage werden Pipes/Mailslots/etc "ausgelöst", was dazu führt, dass Wait- und Read-Funktionen zurückkehren - natürlich ohne Daten zur Verfügung zu haben. Wenn die Programme mit diesem Fall nicht umgehen können (nur ein Beispiel von vielen: Tobit David’s interne Inter-Prozess-Kommunikation), dann kommt es zu Fehlern und Zugriffsverletzungen in den entsprechenden Programmen.
Eine saubere Lösung für den Benutzermodus kenne ich nicht.