в случае сбоя одного из них последующие методы вызывать не следует.Короче говоря, набор вызовов должен быть атомарным.
Это не то, что означает атомарность.Как объясняли другие ответы, этого можно добиться, просто проверив результат каждого вызова метода и остановившись, когда вы получите определенный результат.
Атомный означает, что либо все методы вызваны, либо ни один из них не вызван.Таким образом, вы гарантируете, что весь блок работает или не работает вообще.Это не то, чего вы можете достичь с помощью кода C # или большинства известных мне языков.
То, что вам нужно будет сделать, это отделить результаты проверки от окончательной обработки и вместо этого поставить в очередь окончательную обработку.
Вместо:
bool Method1() {
if (CheckCondition)
return false;
DoSomethingImportant();
return true;
}
bool Method2() {
if (CheckCondition)
return false;
DoSomethingElseImportant();
return true;
}
...
var success1 = Method1();
if (!success1)
return;
var success2 = Method2();
if (!success2)
return; // oops we already did something important in method1
Сделайте что-то вроде:
bool Method1() {
if (CheckCondition)
return false;
queue.Enqueue(DoSomethingImportant);
return true;
}
bool Method2() {
if (CheckCondition)
return false;
queue.Enqueue(DoSomethingElseImportant);
return true;
}
...
var success1 = Method1();
if (!success1)
return;
var success2 = Method2();
if (!success2)
return; // no problem, nothing important has been invoked yet
// ok now we're completely successful, so now we can perform our important actions
while (queue.Any()) {
var doSomethingImportant = queue.Dequeue();
doSomethingImportant();
}
Это все еще далеко от того, чтобы быть фактически "атомарным", но оно дает вам очень простой эффект "все или ничего".