В моем приложении F# (FsXaml/Код позади) я хотел бы использовать индикатор выполнения без использования фонового рабочего, как я делаю в C#. Основываясь на статье в Интернете (ссылка здесь), я попытался использовать асинхронные рабочие процессы.
Я создал код, основанный (в некоторой степени) на примерах из вышеупомянутой статьи, но он работал не так, как я ожидал. Текущий поток (поток пользовательского интерфейса) по-прежнему заблокирован, как если бы там не было асинхронного кода. Никакого переключения на фоновый поток не происходит. Индикатор выполнения активируется только после завершения длительной операции. Удаление функции onThreadPool не имеет никакого эффекта.
Мой вопрос: что не так в моем коде и как это исправить?
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