Asynchronus WPF数据网格在加载时显示数据

时间:2015-07-16 12:18:17

标签: c# wpf wpf-controls task-parallel-library wpfdatagrid

我不确定我在哪个区域出错,可以使用一些帮助。我想我不是在后台正确更新数据网格,或者我没有正确使用任务并行库。我对这两个都不熟悉。

我希望看到我的数据加载,知道我的任务是异步运行的。虽然这只是未来的示例测试应用程序,但此代码将成为用户的响应式表单。

现在所有数据都会在调用代码的末尾加载。以下是我的代码。

(请原谅一些凌乱的命名约定和错误处理,因为我在阅读时已经改变了很多东西,所有我关注的是网格的异步加载)。

private void btnRunSearch_ClickAsync(object sender, RoutedEventArgs e)
{
    _isSearching = !_isSearching;
    ToggleUIIsSearching(_isSearching);

    _webResults.Add(new WebResult { Description = "test item", DisplayUrl = "www.what?", Title = "Random Preload Title", Url = "www.www.www" });
    dgWebResults.Items.Refresh();

    try
    {
        // Copy the textbox value to a new variable for thread safety.
        string searchTerm = tbSearchTerm.Text;

        Task<List<WebResult>> MyTask = Task.Factory.StartNew<List<WebResult>>(() =>
            {
                return new WebSearchLogic().GetFilteredResults(searchTerm, SearcherKey);
            });

        Thread.Sleep(4000);

        UpdateDataGrid(MyTask.Result, true);
        Thread.Sleep(3000);


        _webResults.Add(new WebResult { Description = "2test item", DisplayUrl = "2www.what?", Title = "2Random Preload Title", Url = "2www.www.www" });
        dgWebResults.Items.Refresh();
    }
    catch (AggregateException ae)
    {
        tbSearchTerm.Text = ae.Flatten().Message;
    }
    catch (Exception ex)
    {
        tbSearchTerm.Text = ex.Message;
    }
}


private void UpdateDataGrid(List<WebResult> newItems, bool append)
{
    if (!append)
    {
        _webResults.Clear();
    }

    foreach (WebResult wr in newItems)
    {
        _webResults.Add(wr);
    }

    dgWebResults.Items.Refresh();
}

基本上我想看到第一个测试项目出现,然后看到其他结果出现,最后看到第二个测试项目出现。

非常感谢任何帮助。

此致 Adam Heeg

0 个答案:

没有答案