在回调中停止方法和循环

时间:2013-07-12 11:25:14

标签: c# loops methods callback break

问题1。我想知道是否可以在内部操作的回调中停止循环?
问题2. 我可以在回调中停止SomeMethod()吗?

E.g。我有一个代码:

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多余......

解决方案
在@Tigran的建议之后,我注意到我应该做的就是改变我的GetDirectories定义。

自:

public static IEnumerable<string> GetDirectories(string root, string searchRegex, bool skipSystemDirs = false, Action<string> callback = null) {}

要:

public delegate bool MyCallback(string s);
public static IEnumerable<string> GetDirectories(string root, string searchRegex, bool skipSystemDirs = false, MyCallback callback = null)

然后我可以在回调函数中返回一个标志,并在GetDirectories()内提供。

顺便说一下。有趣的是,当我们将"GetDirectories"作为二进制文件时,我们可能无法在委托中停止它......我们必须等到它的执行完成。

1 个答案:

答案 0 :(得分:3)

问题1:

如果使用lambda将捕获的变量,则可以使用。喜欢:

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;
});