Habe nur kurz in deinen Code geschaut, aber der scheint hier zu hängen:
Task.Wait;
Das willst du doch gar nicht !?
In der Tat - das ist die Ursache für den Blocker.
Allerdings crasht das Programm beim Beenden, wenn man den Progress-Dialog abbricht. Da versucht dann ein OnProgress aus der Queue auf die nicht mehr existierende Progressbar zu schreiben. Genau solche Probleme werden auch in meinem Artikel behandelt.
Eine gute Empfehlung für eine tiefergreifende Lektüre ist übrigens das Buch
Delphi Event-based and Asynchronous Programming von
Dalija Prasnikar, was auch in dem Artikel verlinkt wird.