V mojom F# (FsXaml/Kód Pozadu) žiadosť, by som chcel použiť pokrok bar bez využitie pozadí pracovník, ako som si v C#. Na základe článku na internet (odkaz tu), snažil som sa používať asynchrónnym pracovných postupov.
Vytvoril som kód na základe (na niektoré rozšíriť) na príklady v uvedenom článku, ale to nie je práca ako som očakával. Aktuálne vlákno (UI vlákno) je stále blokované ako keby č async kód bol tam. Žiadny prechod na pozadí niť sa vyskytuje. Na indikačnej lište sa aktivuje len po dlhý beh prevádzky bolo hotové. Odstránenie onThreadPool funkcia nemá žiadny vplyv.
Moja otázka je: Čo je zlé v mojom kóde a ako na to právo?
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