【问题标题】:Unable to step through foreach loop无法单步执行 foreach 循环
【发布时间】:2012-11-02 07:17:00
【问题描述】:
private async void Clicked(object sender, RoutedEventArgs e)
{
    StorageFolder s;
    s = KnownFolders.DocumentsLibrary;
    IReadOnlyList<StorageFile> l = await s.GetFilesAsync();
    bool exists=false;
    foreach (StorageFile sf in l)
    {
        if (string.Equals(sf.Name, "encrypted.txt", StringComparison.CurrentCultureIgnoreCase))
            exists = true;
    }
    MessageDialog d = new MessageDialog(exists.ToString());
    await d.ShowAsync();
}

调试代码时,我无法单步执行foreach 循环中的代码

虽然在循环结束时存在的值是正确的,如果我将MessageDialog 代码放入循环中,我可以看到循环执行,知道如何正确地进入循环吗?

即使我将 MessageDialog 代码放入循环中,我也无法进入 if 条件,所以我怀疑问题出在某个地方

编辑:在 if 条件上设置断点有效(目前我将其放在函数的第一行),但我不应该能够正常使用F11 如果我要逐行调试? (至少在 TurboC 中是这样工作的)

EDIT2:我能想到的最简单的方法来清楚地显示问题:http://www.youtube.com/watch?v=10GgXCqLlVo&feature=youtu.be(跳到 25 秒标记以查看实际问题)

【问题讨论】:

  • 您在调试版本中吗?发布版本?
  • @MarcGravell 它是一个调试版本,还添加了更多细节
  • F11 步进入一个成员通常 - F10 是步超过当前语句。
  • 如果你只是把断点放在 foreach 里面呢?会被击中吗?
  • @JonSkeet 是的,所以 F11 应该进入 for 循环,然后进入 if 条件,对吗?还是我误解了 over 和 into 的含义?

标签: c# .net


【解决方案1】:

我不知道调试如何与异步方法一起工作的细节(我不倾向于使用调试器),但您需要了解系统基本上会回调该方法,从它返回(就调用者而言)当它第一次到达尚未完成的await 表达式时。

我会在bool exists=false; 行上放置一个断点,即第一个await 表达式之后。然后,您应该能够使用 F10(跳过)来遍历循环。

或者,您可以使用 LINQ 完全摆脱循环:

bool exists = l.Any(sf => string.Equals(sf.Name, "encrypted.txt",
                              StringComparison.CurrentCultureIgnoreCase));

【讨论】:

  • bool exists=false 语句上设置断点具有相同的结果:( 不过可能会使用 LINQ 方法,似乎更适合这种情况。
  • @Akash:不清楚您所说的“相同结果”是什么意思 - 究竟会发生什么?
  • 调试器仍然没有进入foreach循环(它只是将foreach行中的l高亮一次,然后跳转到MessageDialog
  • 如果有帮助,请录制短片:youtube.com/watch?v=10GgXCqLlVo&feature=youtu.be
  • @Akash:好吧,看起来确实很奇怪。恐怕在这一点上不知道。如果你可以将一个简短但完整的程序以 zip 文件的形式发布,我今晚可以在家试一试……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多