在我的F# (FsXaml/Code Behind)应用程序中,我想使用进度条而不像在 C# 中那样使用后台工作程序。根据互联网上的一篇文章(链接在这里),我尝试使用异步工作流。
我基于上述文章中的示例(在某种程度上)创建了代码,但它并没有像我预期的那样工作。当前线程(UI 线程)仍然被阻塞,就好像那里没有异步代码一样。不会切换到后台线程。只有在长时间运行的操作完成后才会激活进度条。删除onThreadPool函数没有任何效果。
我的问题是:我的代码有什么问题以及如何改正?
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