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