2
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 秒标记以查看实际问题)

4

1 回答 1

1

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

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

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

bool exists = l.Any(sf => string.Equals(sf.Name, "encrypted.txt",
                              StringComparison.CurrentCultureIgnoreCase));
于 2012-11-02T07:23:18.713 回答