从另一个线程更新Datagrid的ItemSource

问题描述 投票:0回答:1

我在这里已经看到许多这类问题的答案,但似乎都不能解决我的问题。

我有一个页面可以检索并显示数据库中的数据列表。我的初始代码看起来像这样

   private void HistoryPage_OnLoaded(object sender, RoutedEventArgs e)
    {
       //''''''
        _invoices = Invoice.GetAll(); // returns a list of invoices
        DgInvoices.ItemsSource = _invoices;
      //''''''''' 
    }

这正常,直到数据列表变大。现在此操作大约需要6-8秒。然后我尝试从另一个线程获取数据并从那里更新Datagrid(DGInvoices)。

   private void HistoryPage_OnLoaded(object sender, RoutedEventArgs e)
    {
       //''''''''

        new Thread(() =>
        {
            _invoices = Invoice.GetAll();
            DgInvoices.ItemsSource = _invoices;
        }).Start();
    }

引发此异常

调用线程无法访问此对象,因为其他线程拥有它

经过搜索后,我发现分派器是解决此问题的方法。但我无法使其正常工作。

    private void HistoryPage_OnLoaded(object sender, RoutedEventArgs e)
    {
       //''''''''
        new Thread(() =>
        {
            _invoices = Invoice.GetAll();
            Dispatcher.Invoke(() =>
            {
                DgInvoices.ItemsSource = InvoiceList.CurrentItems;
            });

        }).Start();
    }

这仍然会引发上述异常。

您能推荐一种使此工作正常进行的方法吗?

c# wpf multithreading datagrid dispatcher
1个回答
0
投票

您为什么在新线程中使用Dispatcher?

您可以在新线程之外简单地使用Dipatcher。

喜欢这个:

Dispatcher.Invoke(() =>
        {
            DgInvoices.ItemsSource = InvoiceList.CurrentItems;
        });

因此您可以在主线程上调用,而不能在新线程上调用

© www.soinside.com 2019 - 2024. All rights reserved.