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

甚至Resharperreturn这里是多余的......

解决方案
在@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"作为二进制文件时,我们可能无法在委托中停止它......我们必须等到它的执行完成。

4

1 回答 1

3

问题一:

您可以使用将由 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;
});
于 2013-07-12T11:27:15.747 回答