V mé F# (FsXaml/Code Behind) aplikace, chtěl bych použít progress bar bez využití zázemí pracovníka, jak udělám v C#. Na základě článku na internetu (odkaz je tady), jsem se snažil použít asynchronní pracovní postupy.
Vytvořil jsem kód založený (do jisté míry) na příklady ve výše zmíněném článku, ale to nefungovalo, jak jsem čekal. Aktuální vlákno (UI vlákno) je stále blokována, jako kdyby žádná asynchronní kód tam byl. Žádné přepínání na pozadí nit dochází. Progress bar je aktivován pouze po dlouho běžící operace byla dokončena. Odstranění onThreadPool funkci nemá žádný vliv.
Moje otázka je: Co je špatně v mém kódu a jak to napravit?
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