Предположим нужно брать строки из списка urls ... список создан, файл со строками указан, установлены галочки брать из файла, сохранять изменения списка в файл ... и в PM созданы 2 переменные - url и label (в первую попадет взятая потоком уникальная строка, во второй метка/идентификатор этой строки, по которуму после выполнения всех действий мы цдалим эту строку из списка)
lock(SyncObjects.ListSyncer){
for(int i=0; i<project.Lists["urls"].Count; i++){
if ( project.Lists["urls"][i].Contains("busy") == false ){ // если никакой другой поток с этой строкой не работает
project.Variables["url"].Value = project.Lists["urls"][i]; // кладем строку в переменную
project.Lists["urls"].RemoveAt(i); // удаляем эту строку из списка
project.Variables["label"].Value = Macros.TextProcessing.RandomText(7,"d",""); // генерим метку/id взятой строки
project.Lists["urls"].Add(project.Variables["url"].Value+"|busy-"+project.Variables["label"].Value); // возвращаем уже с прибавкой busy-label
break; // прерываем цикл т.к строку взяли
}
}
}
if ( project.Variables["url"].Value == "" ){
throw new Exception("URLы закончились"); // выход по красной ветке
}
После отработки данного кубика у вас будут заполнены переменные url и label ... или же кубик будет завершен по красному выходу (в случае если свободных строк нет)
Ну и не забывайте после выполнения всех действий удалить из списка urls строку содержащую текст переменной label
UPD: предвижу вопрос - зачем нужна метка/идентификатор строки, почему бы после выпонлнения всех действий просто не удалить по взятому url ? .... потому что в списке может быть несколько одинаковых строк (ну задачи же разные могут быть) и тогда удаляться все такие строки, а у с уникальной меткой только нужная (та с которой работал этот конкретный поток)