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

时间:2015-03-24 11:35:58

标签: c# wpf multithreading user-interface data-binding

我有一个工作线程,用于在每个更改用户完成后计算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并带有消息

  

调用线程无法访问此对象,因为它不同   线程拥有它。

2 个答案:

答案 0 :(得分:0)

我通常使用略有不同的方式:

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

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

尝试,可能是一个原因。

答案 1 :(得分:0)

经过一些研究,我发现信息可以准确满足我的需求,因为在我的情况下,我需要在任务中的所有计算完成后才更新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();
}