में एफ# (FsXaml/पीछे कोड) आवेदन, मैं का उपयोग करने के लिए एक प्रगति पट्टी के बिना उपयोग के लिए एक पृष्ठभूमि के कार्यकर्ता के रूप में मैं सी# में. के आधार पर इंटरनेट पर एक लेख में (लिंक यहाँ), मैं करने की कोशिश की, का उपयोग अतुल्यकालिक वर्कफ़्लोज़.
मैं बनाया कोड के आधार (कुछ विस्तार करने के लिए) पर उदाहरण में ऊपर उल्लिखित लेख है, लेकिन यह काम नहीं किया था के रूप में मैं उम्मीद थी. वर्तमान धागा (यूआई धागा) अभी भी अवरुद्ध है के रूप में अगर कोई async कोड वहां गया था. कोई स्विचन के लिए एक पृष्ठभूमि धागा होता है । प्रगति पट्टी को सक्रिय होता है के बाद ही लंबे समय से चल रहे आपरेशन समाप्त हो गया है । हटाने के 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