En mi F# (FsXaml/Código Detrás) de la aplicación, me gustaría usar una barra de progreso sin la utilización de un fondo trabajador como yo lo hago en C#. Basado en un artículo en internet (el enlace está aquí), he intentado utilizar flujos de trabajo asincrónicos.
He creado el código (en cierta medida) en los ejemplos en el artículo citado, pero no funcionó como yo esperaba. El subproceso actual (subproceso de interfaz de usuario) está todavía bloqueado como si no código asincrónico estaba allí. No tienes que cambiar a un subproceso de fondo se produce. La barra de progreso se activa sólo después de la larga marcha de la operación ha sido terminada. La eliminación de la onThreadPool función no tiene ningún efecto.
Mi pregunta es: ¿Cuál es el error en mi código y cómo hacer lo correcto?
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