W moim programie F# (FsXaml/Kod tyłu) chciałbym wykorzystać wskaźnik wykonania bez użycia tła pulpitu, jak to zrobić w C#. Opierając się na artykule w Internecie (link tutaj), próbowałem użyć asynchroniczne procesy robocze.
Stworzyłem w oparciu o kod (w pewnym stopniu) na przykładach z artykułu powyżej, ale nie pracował tak, jak się spodziewałem. Aktualny przepływ (wątek interfejsu użytkownika) nadal jest zablokowany, jak gdyby tam nie było asynchronicznego kodu. Żadnego przełączania na wątek w tle nie dzieje. Pasek postępu jest aktywowany dopiero po zakończeniu długiej operacji. Usuwanie funkcji onThreadPool nie ma żadnego efektu.
Moje pytanie: co jest nie tak w moim kodzie i jak to naprawić?
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