У меня есть работа по обработке данных, которая состоит из примерно 20 последовательных шагов. Шаги все подпадают под одну из трех категорий:C# TPL: Возможно перезапустить неудавшийся трубопровод на произвольном шаге?
- сделать некоторые файл манипуляции
- импорт/экспорт данных из базы данных
- сделать вызов на третьей стороной веб-API
I» ve реорганизовал код из одного длинного, ужасного метода в шаблон трубопровода, используя примеры here и here. Все шаги являются TransformBlock, такие как
var stepThirteenPostToWebApi = new TransformBlock<FileInfo, System.Guid>(async csv =>
{
dynamic task = await ApiUtils.SubmitData(csv.FullName);
return task.guid;
});
Код работает большую часть времени, но иногда шаг в трубопроводе не может по каким-либо причинам - скажем, поврежденный файл не может быть прочитан на шаге 6 20 (просто пример - любой шаг может завершиться неудачей). Конвейер прекращает выполнение дополнительных задач, как и следовало ожидать.
Однако сторонний веб-API представляет собой сложную задачу - мы взимаем плату за каждое задание, которое мы инициируем, выполним ли мы все 20 шагов или только первый.
Я хотел был бы исправить все, что пошло не так на шаге проблемы (опять же, для нашего примера предположим, что я исправляю поврежденный файл на шаге 6 из 20), затем заберите резервную копию на шаге 6. Третья сторона веб-API имеет GUID для каждого задания и является асинхронным, так что это должно быть хорошо - после устранения проблемы он с удовольствием возобновит работу с оставшимися шагами.
Мой вопрос: Возможно ли (и если это целесообразно?) Разработать конвейер, который может начинаться с любого шага, если предпосылки для этого шага действительны?
Это будет выглядеть примерно так:
- работа терпит неудачу на этапе 6 и журналы шаг 5 как последний успешный шаг
- человек приходит и исправляет любые вызванные шаг 6 на провал
- в новый трубопровод начинается на этапе 6
Я понимаю, грубой силы способ будет иметь StartAtStep2()
, StartAtStep3()
, StartAtStep4()
методов. Это не похоже на хороший дизайн, но я немного новичок в этом шаблоне, поэтому, возможно, это приемлемо.
перебор путь не так уж плохо, например, ваш выше код просто необходимо будет 'BOOL StartAtStepThirteen (FileInfo информация) {вернуться stepThirteenPostToWebApi.Post (информация); } ' –
Я не понимаю, как это будет выглядеть ... мне не нужно будет по существу дублировать весь код с шагов N до конца в каждом методе? Если так, что кажется проблематичным для поддержания. – GojiraDeMonstah
Настройка цепочки должна быть отдельным способом, чем выполнение цепочки. Вы должны сохранить 'stepThirteenPostToWebApi' в переменной уровня класса в классе, представляющем всю цепочку (настройка цепочки может быть выполнена в конструкторе класса). –