I think this needs to be `syncExec`. That way, the calling thread is blocked until the dialog is closed by the user. For example, the `CompilerLaunchHandler` isn't waiting for the YES/NO answer to the question "Project Foo contains errors. Continue launch?", and always skips the launch.