如何从异步任务将ItemsSource添加到DataGrid

时间:2019-12-24 22:44:16

标签: c# wpf asynchronous

我有一个带有Datagrid的WPF应用程序。我希望能够运行一个每次X次从特定位置检索数据并更新DataGrid ItemsSource的代码。该代码不会干扰UI,因此需要以异步方式运行。我开始测试基础知识,但没有成功。我的测试可以编译,但是会引发以下异常:WindowsBase.dll中的“ System.InvalidOperationException”。

我希望有人分享一种简单的方法来解决我认为应该是一个简单的问题。

public void runTask()
{

    List<string> list = new List<string>();

    int counter = 0;

    Task.Run(async () =>
    {
        while (true)
        {
            list.Add(counter.ToString());
            MyDataGrid.ItemsSource = list;   // This is what I want to archive
            counter++;                       // but I get this: Exception thrown: 'System.InvalidOperationException' in WindowsBase.dll

            // Wait 2 seconds
            await Task.Delay(2000);
        }


        private void Button_Click(object sender, RoutedEventArgs e)
        {
            runTask();

        }
    }
}

// User starts the async task
private void Button_Click(object sender, RoutedEventArgs e)
        {
            runTask();
        }

1 个答案:

答案 0 :(得分:0)

我假设您的示例是一个玩具示例,所以我只关注异常。发生这种情况是因为任务在与UI不同的线程上运行,并且您无法从非UI线程更新UI控件。

要通过非UI线程与UI进行交互,请使用Dispatcher:

// inside the non-UI thread
Dispatcher.Invoke(() => 
{
    MyDataGrid.ItemsSource = list;
});