【问题标题】:Async & Await issue in a Metro Style appMetro Style 应用程序中的异步和等待问题
【发布时间】:2012-09-28 22:06:11
【问题描述】:

我有一个简单的 Metro 风格应用程序,但遇到了(异步和等待)问题。

List<string> fileNames = new List<string>();
...
...
LoadList();
...
...
(Problem) Code that accesses the elements of the fileNames List
...
...

private async void LoadList()
{
    // Code that loops through a directory and adds the 
    // file names to the fileNames List using GetFilesAsync()
}

问题是文件名列表被过早访问 - 在它完全加载项目之前。
这是因为异步方法 - 程序继续执行下一行代码,而异步方法继续处理。

列表完全加载后(异步方法完成后)如何访问?

有没有办法在 Metro 应用程序中不使用异步来完成我想要做的事情?

【问题讨论】:

  • 这似乎是使用异步的错误地方。您实际上希望这是一个同步操作。
  • @Dan-o 我正在使用 GetFoldersAsync() 和 GetFilesAsync()。这些是否有同步替代方案?

标签: c# xaml windows-8 microsoft-metro winrt-xaml


【解决方案1】:

您也需要调用方法是异步的 - 而不是拥有fileNames 的变量,我会让LoadList 方法返回它。所以你有:

public async Task ProcessFiles()
{
    List<string> fileNames = await LoadList();
    // Now process the files
}

public async Task<List<string>> LoadList()
{
    List<string> fileNames = new List<string>();
    // Do stuff...
    return fileNames;
}

这确实意味着您需要等待找到所有文件才能开始处理它们;如果您想在找到它们时处理它们,您需要考虑使用某种BlockingCollection。编辑:正如斯蒂芬指出的那样,TPL Dataflow 也很适合这里。

【讨论】:

  • +1。虽然我推荐TPL Dataflow,而不是BlockingCollection
  • @StephenCleary:好点;会把它放进去。(我真的应该再次阅读 Dataflow。我前一段时间做过,但它显然没有陷入......)
  • @JonSkeet 和 StephenCleary - 感谢您的回复。看来我需要以同步方式执行此操作。现在我正在使用 StorageFolder 类中的 GetFoldersAsync() 和 GetFilesAsync()。我可以使用什么“同步”替代方法来代替这两种方法?
  • @nv.snow:为什么你需要以同步的方式来做这件事?
  • @JonSkeet - 主要是因为程序的其余部分依赖于这个列表,如果我在列表完全加载之前跳转到下一行代码,它就会中断。另外,我不需要访问数百个文件,因此我认为同步替代方案不会产生巨大影响。我尝试了 Async 方法,因为这是我在寻找访问文件和目录的方法时发现的。
猜你喜欢
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-24
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 2018-12-09
相关资源
最近更新 更多