如何在调用长时间运行的进程之前更新viewmodel上的属性?

时间:2017-09-09 07:38:13

标签: wpf multithreading mvvm

我有以下代码:

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属性(是的,丑陋的,我知道)。

1 个答案:

答案 0 :(得分:0)

您是否尝试过Dispatcher.Invoke?它将任务保留在UI线程上。 当然,你必须将ShowProgressBar=False移到代表中。

Public Sub ExecuteMyCommand
    ShowProgressBar=True
    Me.Dispatcher.Invoke(DispatcherPriority.Normal, New LongRunningProcessDelegate())
End Sub

我还将UI修改逻辑与计算任务分开,即任务在完成时应回调到UI线程,并且UI元素的修改将留给回调。