Как было сказано ранее, для обновления пользовательского интерфейса, или все-таки сделать это разблокировано и использовать при этом очень долго операциях вы должны сделать эту операцию в другом потоке. Вы можете использовать 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 –
Это здорово, но не соответствует тому, что я хочу делать. Моя операция не может выполняться в отдельном потоке, потому что она создает элементы пользовательского интерфейса, а не только длительную операцию. Так, я могу сказать. У него не может быть решения когда-либо. –