Dans mon F# (FsXaml/Code-Behind) de l'application, je voudrais utiliser une barre de progression sans l'utilisation d'un arrière-plan travailleur comme je le fais en C#. Basé sur un article sur internet (le lien est ici), j'ai essayé d'utiliser asynchrone des flux de travail.
J'ai créé la fonction de code (un peu) sur les exemples dans l'article mentionné ci-dessus, mais cela n'a pas fonctionné comme je l'avais prévu. Ce thread (thread d'INTERFACE utilisateur) est toujours bloqué comme si async code était là. Pas de changement à un thread d'arrière-plan se produit. La barre de progression est activée qu'après la longue course de l'opération a été terminée. Retrait de la onThreadPool fonction n'a aucun effet.
Ma question est: Quel est le problème dans mon code et comment le faire?
type MainWindowXaml = FsXaml.XAML<"XAMLAndCodeBehind/MainWindow.xaml">
type MainWindow() as this =
inherit MainWindowXaml()
//....some code....
let ButtonClick _ =
//....some code....
let longRunningOperation() = //....some long running operation (reading from Google Sheets)....
let progressBar() = this.ProgressBar.IsIndeterminate <- true
let doBusyAsync progress operation =
progress
async
{
do! operation
}
|> Async.StartImmediate
let onThreadPool operation =
async
{
let context = System.Threading.SynchronizationContext.Current
do! Async.SwitchToThreadPool()
let! result = operation
do! Async.SwitchToContext context
return result
}
let asyncOperation progress operation =
async { operation }
|> onThreadPool
|> doBusyAsync progress
(progressBar(), longRunningOperation()) ||> asyncOperation
do
//....some code....
this.Button.Click.Add ButtonClick