Как читать произвольную папку в универсальном приложении?

Я пытаюсь научиться писать универсальные приложения, и я начинаю, пытаясь воссоздать другой проект, который я написал в WinForms. Мне нужно иметь возможность читать из файлов журналов в произвольной папке, и, насколько я понимаю, мне нужно получить права доступа пользователей к папке. Затем я должен сохранить токен доступа, чтобы впоследствии перечитать эту папку. Прочитав вокруг, мне удалось собрать следующий код:

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

Но, похоже, это не работает. На этом этапе у меня есть форма, содержащая только TextBlock и Button. Dim myFolder As StorageFolder = GetLogFolder . Результат кнопки вызывает метод, который будет анализировать все файлы * .log в данной папке. Первое, что он делает, это:

GetLogFolder

Когда код запускается, и я нажимаю кнопку, я получаю диалоговое окно браузера папки, но потом все зависает, и мне нужно переключиться на Visual Studio и нажать stop. Вероятно, я сделал какую-то глупую ошибку, но я не могу понять, что это.

Любая помощь приветствуется.

vb.net,uwp,windows-10-universal,

1

Ответов: 1


1 принят

Проблема, скорее всего, не вызвана самим кодом доступа к файлу, но, кстати, вы используете Taskhronous API.

Поскольку StorageFolderметод возвращает Resultиз async/await, вам нужно будет GetLogFolder в FolderPicker вместо того , чтобы получить его , используя Resultсвойство. Причина в том, что Taskшаблон позволяет вам работать с I / O в отдельном потоке, но при завершении возвращать управление обратно в поток пользовательского интерфейса . Что вы здесь делаете, это вызов GetLogFolderметода, в котором вы разрешаете пользователю выбирать папку с помощью Result. Вот проблема: пользователю предоставляется папка, в то время как элемент управления возвращается к вашему коду, и вы запрашиваете Taskсвойство GetLogFolderвозвращаемого Resultметодом. Запрос Taskсвойства заставляет поток пользовательского интерфейса останавливаться и ждать, пока Taskон закончит, чтобы получить результат. К сожалению, когда пользователь выбирает папку, элемент управления хочет вернуться к потоку пользовательского интерфейса, чтобы продолжить выполнение остальной части asyncметода, и у нас есть тупик . Resultсвойство остановило поток пользовательского интерфейса, чтобы дождаться awaitрезультата, и Clickожидает, что поток пользовательского интерфейса станет доступным. Нельзя продолжать, чтобы приложение полностью зависало.

Решение довольно просто - с помощью async/ awaitkeywords. Вы можете прочитать о них больше в VB.NET здесь с ясным примером .

В вашем случае первым шагом было бы сделать Clickметод обработчика кнопки, asyncа затем заменить код внутри следующим:

Dim myFolder As StorageFolder = Await GetLogFolder
vb.net, uwp, windows-10-universal,
Похожие вопросы