F# (FsXaml / Code Behind) uygulamamda, C# ' da yaptığım gibi bir arka plan çalışanı kullanmadan bir ilerleme çubuğu kullanmak istiyorum. İnternetteki bir makaleye dayanarak (bağlantı burada), eşzamansız iş akışlarını kullanmaya çalıştım.
Yukarıda belirtilen makaledeki örneklere dayanarak (bir dereceye kadar) kod oluşturdum, ancak beklediğim gibi çalışmadı. Geçerli iş parçacığı (UI iş parçacığı) hala async kodu yokmuş gibi engellendi. Arka plan iş parçacığına geçiş gerçekleşmez. İlerleme çubuğu ancak uzun süren işlem tamamlandıktan sonra etkinleştirilir. onThreadPool işlevinin kaldırılmasının hiçbir etkisi yoktur.
Sorum şu: Kodumda yanlış olan nedir ve nasıl düzeltilir?
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