至於以更新UI,或者仍然使其暢通和可用的,而這樣做很長的操作,必須做其他線程操作之前說。您可以使用BackgroundWorker
來做到這一點。如果你不想只爲新線程創建新的方法,你可以委託他們,你可以做這樣的事情:
Imports System.ComponentModel
Sub DoLongOperation()
Dim bgWorker As New System.ComponentModel.BackgroundWorker()
bgWorker.WorkerReportsProgress = True
AddHandler bgWorker.DoWork,
Sub(sender, args)
For K as integer = 0 to 50
'Here I create tools and add them to a StackPanel in the window
'While doing this I update a progressBar value
bgWorker.ReportProgress(123)
Next
End Sub
AddHandler bgWorker.ProgressChanged,
Sub(sender, args)
ProgressBar.Value = args.ProgressPercentage
End Sub
AddHandler bgWorker.RunWorkerCompleted,
Sub(sender, args)
End Sub
End sub
既然你不能添加/刪除或做其他線程其他事情上StackPanel
,你可以把你想要添加到bgWorker.ReportProgress()
方法的項目,然後從.ProgressChanged
事件更新它,所以它會是這樣的:
AddHandler bgWorker.DoWork,
Sub(sender, args)
For K as integer = 0 to 50
'Here I create tools and add them to a StackPanel in the window
'While doing this I update a progressBar value
Dim item As Object 'stackpanel's item that you want to add later on. Can be any type
bgWorker.ReportProgress(123, item)
Next
End Sub
AddHandler bgWorker.ProgressChanged,
Sub(sender, args)
ProgressBar.Value = args.ProgressPercentage
StackPanel.Chlidren.Add(args.UserState)
End Sub
你應該使用'IProgress'和'await'。有關詳細信息,請參見[此處](http://blog.stephencleary.com/2012/02/reporting-progress-from-async-tasks.html)。 –
http://stackoverflow.com/a/18033198/2882256 –
這很好,但不符合我想要做的。我的操作不能在單獨的線程中運行,因爲它會創建UI元素,而不僅僅是一個長操作。所以,我可以說。它不能有解決方案。 –