代码之家  ›  专栏  ›  技术社区  ›  Slugsie

如何在通用应用程序中读取任意文件夹?

  •  1
  • Slugsie  · 技术社区  · 9 年前

    Friend Async Function GetLogFolder() As Task(Of StorageFolder)
        Dim myLogFolder As StorageFolder
        If ApplicationData.Current.LocalSettings.Values.ContainsKey("LogFolder") Then
            Dim sToken As String = ApplicationData.Current.LocalSettings.Values("LogFolder")
            myLogFolder = StorageApplicationPermissions.FutureAccessList.GetFileAsync(sToken)
        Else
            Dim myFolderPicker As FolderPicker = New FolderPicker
            myFolderPicker.FileTypeFilter.Add("*")
            myLogFolder = Await myFolderPicker.PickSingleFolderAsync
    
            Dim sToken As String = StorageApplicationPermissions.FutureAccessList.Add(myLogFolder)
            ApplicationData.Current.LocalSettings.Values.Add("LogFolder", sToken)
        End If
        Return myLogFolder
    End Function
    

    但这似乎不起作用。在这个阶段,我有一个只包含文本块和按钮的表单。单击按钮将调用一个方法,该方法将解析所有*。指定文件夹中的日志文件。它做的第一件事是:

    Dim myFolder As StorageFolder = GetLogFolder.Result
    

    当代码运行时,我单击按钮,会显示一个文件夹浏览器对话框,但随后所有内容都冻结,我必须切换到Visual Studio并点击停止。我可能犯了一些愚蠢的错误,但我不知道是什么。

    任何帮助都将不胜感激。

    1 回复  |  直到 9 年前
        1
  •  1
  •   Martin Zikmund    9 年前

    问题很可能不是由文件访问代码本身引起的,而是由使用异步API的方式引起的。

    因为 GetLogFolder 方法返回 Task 属于 StorageFolder ,您需要等待结果,而不是使用 Result 所有物原因是 async/await 模式允许您执行以下操作: I/O工作在单独的线程上,但完成后将控制返回到UI线程 .你在这里要做的是打电话给 方法,让用户使用 FolderPicker . 问题出在这里 -当控件返回到代码并查询 后果 财产 任务 返回 GetLogFolder 方法质疑 后果 属性导致UI线程停止并等待 任务 以获得结果。不幸的是,当用户选择文件夹时,控件希望返回UI线程继续执行 GetLogFolder 僵局 . 后果 属性停止UI线程以等待 任务 任务

    解决方案非常简单-使用 async / await 关键词。您可以在VB.NET中阅读有关它们的更多信息 here with a clear example .

    在您的情况下,第一步是使按钮 Click 处理程序方法 然后将内部代码替换为以下代码:

    Dim myFolder As StorageFolder = Await GetLogFolder