如何调用从工作线程更新绑定数据的 viewModel 方法?

How to call viewModel method which updates binding data from worker thread?

我有一个工作线程,它在用户进行每次更改后计算 DataGrid 的数据。在某些情况下,用户更改速度太快,因此在 GUI 线程上我调用

Thread.Abort();

同时在工作线程上我使用了这样的构造

    while (true)
    {
        try
        {
            _calculateEvent.WaitOne();

            ...

            Application.Current.MainWindow.Dispatcher.BeginInvoke((Action)delegate()
            {
                _viewModel.UpdateInterfaceFromAssigningInfo(assigningInfo);
            });
        }
        catch (ThreadAbortException)
        {
            Thread.ResetAbort();
        }
     }

完全不知道它是否有效,但目前我的主要问题是我无法在 GUI 线程上调用代码来更新界面。在 Invoke 行我有异常:InvalidOperationException 消息

The calling thread cannot access this object because a different thread owns it.

我通常使用稍微不同的方式:

Application.Current.MainWindow.Dispatcher.BeginInvoke(new Action( ()=>

            {
                _viewModel.UpdateInterfaceFromAssigningInfo(assigningInfo);
            }));

试试吧,可能是个原因。

经过一些研究,我找到了准确满足我需求的信息,因为在我的情况下,我需要在任务中的所有计算完成后才更新 UI。

选项 1. 对于 WPF 应用程序,我们可以受益于 同步上下文任务调度程序 ,它在 GUI 线程上运行任务。因此,可以使用这样的场景在任务完成后更新 GUI:

        Task t = Task.Run(() => foo());

        t.ContinueWith((task) =>
        {
            // Update observable properties 
        }, TaskScheduler.FromCurrentSynchronizationContext());

继续任务将在 GUI 线程上执行,因此将能够更新 GUI。

选项 2

private async void DownloadFileButton_Click(object sender, EventArgs e)
{
  // Since we asynchronously wait, the UI thread is not blocked by our code.
  await foo();

  // Since we resume on the UI context, we can directly access UI elements.
  UpdateObservableProperties();
}