我有以下代码:
Public Sub ExecuteMyCommand
ShowProgressBar=True
CallLongRunningProcess
ShowProgressBar=False
End Sub
要使UI中的进度条在长时间运行的进程开始之前实际显示,必须将此代码重写为:
Public Async Sub ExecuteMyCommand
ShowProgressBar=True
Await Task.Run(Sub() CallLongRunningProcess)
ShowProgressBar=False
End Sub
现在出现问题:
在某些方法中,长时间运行的过程涉及创建WPF UserControls。这些必须在STA线程上创建。我已经找到了如何做到这一点,但后来我得到一个InvalidOperationException,因为用户控件由非UI线程拥有。所以,我正在寻找一种方法来在UI线程上调用长时间运行的进程之前更新ShowProgressBar属性(是的,丑陋的,我知道)。
答案 0 :(得分:0)
您是否尝试过Dispatcher.Invoke?它将任务保留在UI线程上。
当然,你必须将ShowProgressBar=False
移到代表中。
Public Sub ExecuteMyCommand
ShowProgressBar=True
Me.Dispatcher.Invoke(DispatcherPriority.Normal, New LongRunningProcessDelegate())
End Sub
我还将UI修改逻辑与计算任务分开,即任务在完成时应回调到UI线程,并且UI元素的修改将留给回调。