2013-07-12 7 views
0

Вопрос 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" как двоичный файл, то мы, вероятно, не можем его остановить в делетете ... Мы должны подождать, пока его выполнение не закончится.

ответ

3

Вопрос 1:

Вы можете, если использовать переменную, которая будет захвачена лямбда. Как:

foreach(...) 
{ 
    var stopIteration =false;  
    myObject.SomeMethod(s => 
     { 
      ... 

      stopIteration = true; //due the some condition 
     }); 

    if(stopIteration)break; 
} 

Вопрос 2:

Просто используйте return

myObject.SomeMethod(s => 
{ 
    //something gone wrong, or need exit; 
     return; 
}); 
+0

Да, но это проблема с этим делом. Мне нужно подождать, пока мой 'SomeMethod' завершит проверку состояния. Но что, если я хочу немедленно разогнать цикл? – Nickon

+3

@ Никсон: используйте обе техники: поэтому установите * stopIteration = true; return; * – Tigran

+0

Затем вернитесь из лямбда немедленно. – Tommi

Смежные вопросы