如何访问在UI线程中的不同线程上创建的DataGrid?

时间:2011-09-14 04:22:13

标签: wpf multithreading user-interface

在论坛和MSDN上,他们使用Dispatcher.Invoke明确了从不同线程访问UI控件的方法。但是,在UI线程中,如何访问在不同线程上创建的DataGrid之外的WPF组件?

在我的情况下,我启动一个线程来处理一个漫长的过程。在这个线程中,我创建了一个DataTable,并将其绑定到也在此线程中创建的DataGrid。

现在,当需要显示DataGrid时,我在UI控件上适当地调用Dispatcher.Invoke。但是,当我尝试在我的UI线程中访问DataGrid时,我得到一个异常 - 调用线程无法访问此对象,因为另一个线程拥有它。

请提出任何建议..

public void AddResultsController(ResultsController controller)
{
  NewResultsControllerDisplayDelegate newControllerDisplayDelegate = new NewResultsControllerDisplayDelegate(NewResultsControllerDisplay);
  this.docManager.Dispatcher.BeginInvoke(newControllerDisplayDelegate, System.Windows.Threading.DispatcherPriority.Normal, controller);
}

delegate void NewResultsControllerDisplayDelegate(ResultsController controller);
private void NewResultsControllerDisplay(ResultsController controller)
{
   Grid grd = new Grid();
   grd.Children.Add(controller.SummaryDataGrid);   // Exception is thrown here
}

在我的后台帖子中,我打电话给...

m_mainWindow.AddResultsController(m_controller);

2 个答案:

答案 0 :(得分:1)

您只需在后台线程上创建UI元素。让您的生活更轻松,并遵循该规则。

答案 1 :(得分:0)

试试这个:

public void AddResultsController(ResultsController controller)
{
  NewResultsControllerDisplayDelegate newControllerDisplayDelegate = new NewResultsControllerDisplayDelegate(NewResultsControllerDisplay);
   Grid grd = new Grid();
   grd.Children.Add(controller.SummaryDataGrid); 
  this.docManager.Dispatcher.BeginInvoke(newControllerDisplayDelegate, System.Windows.Threading.DispatcherPriority.Normal, grd);
}

delegate void NewResultsControllerDisplayDelegate(ResultsController controller);
private void NewResultsControllerDisplay(Grid grd)
{
   this.docManager.Add(grd);
}

H个。