Я бы сделал так:

## Код:
```
DownloadAction = POINTER TO RECORD(Services.Action) 
   list : (* список файлов для скачивания, и всего, что необходимо для работы *)
   currentFile : (* какой либо указатель на текущий файл*)
END;

PROCEDURE(da : DownloadAction) Do;
BEGIN
   IF ФайлЗагружен(da.currentFile) THEN
      da.currentFile:=СледующийФайл();
   ELSIF ~ФайлЗагружен(da.curentFile) THEN
      ЗагрузитьЧасть(da.currentFile)
   END;
   IF ~ВсеФайлыЗагружены(da.list) THEN Services.DoLater(da, Services.now) END
END Do;

PROCEDURE Start;
VAR da : DownloadAction;
BEGIN
   NEW(da); da.list:=... da.currsntFile:=(первый файл)
   Services.DoLater(da, Services.now) (запускаем наше действие в свободное плавание)
END Start;
```


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