Есть программа, которая должна скачивать из сети несколько файлов. Сначала были использованы блокирующие функции для работы с сетью, основным недостатком данного метода было то, что интерфейс пользователя никак не реагировал, в то время, пока работали блокирующие функции. После чего плокирующие функции были заменены на неблокирующие, при этом интерфейс пользователя перестал блокироваться. Теперь требуется скачивать файлы последовательно (то есть следующий файл начинает скачиваться только после предыдущего), но в неблокирующем режиме.
Одним из вариантов является следующий псевдокод:

PROCEDURE (c: NetworkClient) Do-;
VAR Net2: NetworkClient;
BEGIN
IF файл скачался THEN
(* Скачиваем следующий файл *)
NEW(Net2);
Net2.GetFile(Какие-то параметры);
Services.DoLater(Net2, Services.Ticks() + Services.resolution);
ELSE
Services.DoLater(c, Services.Ticks() + Services.resolution);
END

END Do;

PROCEDURE Start;
VAR Net: NetworkClient;
BEGIN
NEW(Net);
Net.GetFile(какие-то параметры);
Services.DoLater(Net, Services.Ticks() + Services.resolution);
END Start;

Но данный метод мне не очень нравится, так как приходится использовать рекурсию там, где цикла вполне хватило бы. В идеале хотелось бы иметь следущий код:

PROCEDURE Start;
VAR i: INTEGER;
Net: NetworkClient;
BEGIN
New(Net);
FOR i := 0 TO N DO
Net.GetFile(Address[i], SaveAsFile[i]);
Services.DoLater(Inet, Services.Ticks() + Services.resolution);
Services.WaitUntilEnd();
END;
END Start;

То есть хочется чтобы файлы скачивались последовательно, но в неблокирующем режиме, то есть чтобы интерфейс пользователя не блокировался.

Можно ли такое сделать? Может быть есть какие-нибудь другие похожие методы, решающие ту же проблему?