În F# (FsXaml/Cod Spatele) aplicarea, aș dori să utilizați o bară de progres, fără utilizarea de un lucrător fundal ca sa fac in C#. Bazat pe un articol de pe internet (link-ul este aici), am încercat să folosesc asincron fluxuri de lucru.
Am creat codul de baza (pentru a extinde unele) pe exemplele din articolul menționat anterior, dar nu a mers ca am avut de asteptat. Firul curent (UI fir) este încă blocat ca daca nu async cod a fost acolo. Nici o comutare de la un fir de fundal apare. Bara de progres este activat numai după lungă de funcționare operațiunea a fost terminat. Eliminarea onThreadPool funcție nu are nici un efect.
Intrebarea mea este: Ce este greșit în codul meu și cum să facă dreapta pe ea?
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