【问题标题】:Async in Windows store application c#Windows商店应用程序c#中的异步
【发布时间】:2014-01-18 13:14:52
【问题描述】:

您好,这里发生了一些非常奇怪的事情,我让这些代码行在另一个测试解决方案中完美运行,但是当我将它们放在我的主要解决方案中时,我遇到了问题:

当我正常运行时,它什么也不做,当我在Debug中运行并逐步执行时,它可以工作。

private async void InitializeContents()
    {
        var path = @"Assets\Data\";
        var folder = Windows.ApplicationModel.Package.Current.InstalledLocation;
        try
        {
            var file = await folder.GetFileAsync(path + "test.txt");
            var lines = await FileIO.ReadLinesAsync(file);
            var pref = "";
            foreach (string line in lines)
            {                                       
                if (line.ElementAt(0).Equals('-'))
                {
                    switch (line.ElementAt(1))
                    {
                        case 'c': { pref = @"City\";break; }
                        case 'v': { pref = @"Village\"; break; }
                    }
                    continue;
                }
                file = await folder.GetFileAsync(path + pref + line);
                var sub_lines = await FileIO.ReadLinesAsync(file);
            }

        }
        catch (FileNotFoundException)
        {
        }

【问题讨论】:

  • “它什么也没做”是什么意思?您是否添加了任何日志记录以查看发生了什么?你捕捉到一个异常并且什么都不做是没有帮助的......
  • 我尝试添加一些 Debug.Writeline 进行检查,4/5 次我得到这个“线程 0x97c 已退出,代码为 0 (0x0)。”并且它不执行“var sublines..”命令,并且 1/5 按计划工作

标签: c# asynchronous store readline getfiles


【解决方案1】:

您可能没有看到结果,因为您没有等待InitializeContents 完成。关注Task-based Asynchronous Pattern (TAP);我的博客上还有一个async intro,您可能会觉得有帮助。

如果我的猜测是正确的,那么您可以通过使 InitializeContents 返回 Task 而不是 void 来修复代码(并将其重命名为遵循 TAP 命名约定:InitializeContentsAsync),然后调用代码await 是从InitializeContentsAsync 返回的Task

【讨论】:

  • 谢谢,我将返回更改为任务,并在调用它时使用了等待,它起作用了!但是你能解释一下为什么在其他测试解决方案中我每次都可以工作,即使我没有这个添加
  • 在您阅读结果时,无论该方法是否完成,这将是一个竞争条件。因此,有时它可能有效,有时则无效。如果您的测试系统实际上对文件 API 使用了同步存根,那么它始终可以工作(因为它不是真正的异步)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 1970-01-01
  • 2013-03-03
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多