Я тестирую создание приложения UWP с использованием Fabulous framework для написания функциональных кроссплатформенных приложений, и я хочу использовать FilePicker при нажатии кнопки и использовать выбранный файл для некоторой обработки данных.
Выполнение let fileResult = FilePicker.PickAsync() |> Async.AwaitTask
открывает средство выбора файлов и возвращает Async<FileResult>
после выбора файла (это означает, что кнопка и последующий вызов функции выполняются), но остальная часть кода, следующего за ней, будет выполняться до того, как результат можно будет использовать. Если я добавлю |> Async.RunSynchronously
, он (как и ожидалось) блокирует поток, и в появившемся окне нельзя выбрать файл, хотя возвращаемым значением будет FileResult.
Изучив, как это нужно сделать, я понимаю, что средство выбора файлов должно быть открыто в основном потоке, что приводит меня к решению в следующей форме.
let getFileResultAsync =
async {
let tcs = new TaskCompletionSource<FileResult>()
Device.BeginInvokeOnMainThread(fun () ->
async {
let! fileResult = FilePicker.PickAsync() |> Async.AwaitTask
tcs.SetResult(fileResult)
}
|> Async.StartImmediate
)
return! tcs.Task |> Async.AwaitTask
}
который вернет Async<FileResult>
, но похоже, что к блоку Device.BeginInvokeOnMainThread никогда не обращаются. Как мне открыть FilePicker, выбрать файл, а затем обработать файл в таком приложении?