В качестве альтернативы перезапуску перечисления и пропуску вперед вы можете написать перечисление явно, выписав шаги, которые For Each
выполняет за вас за кулисами. Затем вы можете оставить перечислитель на уровне класса, что сделает его тривиальным для возобновления.
например, переменная класса
Private _pathsEnumerator As Dictionary(Of String, String).Enumerator
(К сожалению, поскольку это уровень класса, тип может ' t может быть выведено.)
И тогда ваша итерация будет примерно такой:
_pathsEnumerator = DirectCast(e.Argument, Dictionary(Of String, String).GetEnumerator()
Do While _pathsEnumerator.MoveNext()
Dim kvp = _pathsEnumerator.Current
'Remainder would be the same
Loop
'Reset the enumerator if canceled.
If e.Cancel Then _pathsEnumerator = Nothing
Написанная таким образом, вы можете продолжить, проверив, является ли перечислитель нулевым, и продолжить, если нет . Помните, что если есть шанс изменения словаря, это вызовет исключение, но вы, вероятно, все равно этого захотите; Я бы побеспокоился о logi c в другом ответе, если бы это произошло, вы могли бы обнаружить, что, возобновив работу, вы случайно что-то пропустили.
Возможно, вы захотите отложить проверку отмены до тех пор, пока не выполните операцию текущий элемент; в противном случае вам понадобится лог c для управления повторением этого элемента при возобновлении. Это, вероятно, потребует отслеживания «текущего элемента» в дополнение к перечислителю. Реализация оставлена читателю в качестве упражнения.