Вопрос 1. Интересно, возможно ли остановить цикл в обратном вызове внутренней операции?
Вопрос 2. Могу ли я остановить SomeMethod()
в обратном вызове?Метод остановки и цикл в обратном вызове
Э.Г. У меня есть код, как:
foreach(...)
{
myObject.SomeMethod(s =>
{
// something break-like here to stop foreach/method?
});
}
[править]
Вот пример кода, который я использую - это не работает, как я хочу.
bool test = false;
foreach (var drive in drives)
{
foundFolders.AddRange(
DirectoryWrapper.GetDirectories(drive, regex, true, s =>
{
Dispatcher.Invoke(new Action(() => SetWarningStatus(WarningTypes.Warning,
"Looking for backups: " + Environment.NewLine + s.Trim())), DispatcherPriority.Background);
test = true;
return;
}));
if (test)
break;
}
Даже Resharper
говорит, что return
избыточен здесь ...
Решение
После @ предложение Тиграна я заметил, что всегда то, что я должен сделать, это изменить GetDirectories
определение.
От:
public static IEnumerable<string> GetDirectories(string root, string searchRegex, bool skipSystemDirs = false, Action<string> callback = null) {}
To:
public delegate bool MyCallback(string s);
public static IEnumerable<string> GetDirectories(string root, string searchRegex, bool skipSystemDirs = false, MyCallback callback = null)
Тогда я могу вернуть флаг внутри функции обратного вызова и служить ей в GetDirectories()
.
КПП. что интересно, когда у нас есть наш "GetDirectories"
как двоичный файл, то мы, вероятно, не можем его остановить в делетете ... Мы должны подождать, пока его выполнение не закончится.
Да, но это проблема с этим делом. Мне нужно подождать, пока мой 'SomeMethod' завершит проверку состояния. Но что, если я хочу немедленно разогнать цикл? – Nickon
@ Никсон: используйте обе техники: поэтому установите * stopIteration = true; return; * – Tigran
Затем вернитесь из лямбда немедленно. – Tommi