2012-11-02 95 views
1
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无法步foreach循环

内虽然存在于循环结束的值是正确的,如果我将MessageDialog代码放入循环中,我可以看到循环执行,并且有任何想法如何正确进入循环?

即使当我把MessageDialog代码回路,我无法步入if条件,所以我怀疑问题在于有

编辑地方:把一个断点如果条件工程(目前我把它放在函数的第一行),但我不应该能够正常地使用F11进入循环,如果我正在一行一行地调试? (ATLEAST这是它在TURBOC如何工作)

EDIT2:我能想到的最简单的方式清晰显示问题:http://www.youtube.com/watch?v=10GgXCqLlVo&feature=youtu.be(跳到25秒大关看到实际的问题)

+1

你在调试版本?发布版本? –

+0

@MarcGravell它的一个调试版本,也增加了更多的细节 – Akash

+0

F11步*通常是*成员 - F10是* *当前语句的步*。 –

回答

1

我不了解调试如何在异步方法中工作的细节(我不倾向于使用调试器),但是您需要了解系统基本上会调用返回的方法,并且从调用方返回)当它首次达到尚未完成的await表达式时。

我第一await表达后把一个断点上bool exists=false;行,即。然后您应该可以使用F10(跳过)遍历循环。

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

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

把断点放在'bool exists = false'语句有相同的结果:(可能会使用LINQ方法,似乎更适合于这种情况。 – Akash

+0

@Akash:目前还不清楚“同样的结果”是什么意思 - 究竟会发生什么*? –

+0

调试器仍然不会进入foreach循环它只是在'foreach'行中突出显示'l'并跳转到'MessageDialog'行 – Akash