异步搜索大量数据并显示响应“正在加载...”消息

时间:2015-04-28 16:19:53

标签: c# .net winforms

我被要求实现一个显示大量数据的DataGridView(现在为100.000行)并具有搜索功能。网格已实现,搜索工作正常。当CPU正在搜索网格时,我需要一个正确的Loading ...消息或图片。唯一的问题是我的UI没有响应,它会停止(挂起),直到搜索完成。

我尝试了gif并且它没有获得足够的CPU时间,因此它就像一张死像。 我尝试了一个带有“正在加载......”的标签,其中的点被及时添加并具有动态外观,但这也是悬挂。

我是线程和异步编程的新手。我搜索了很多,但没有得到整个概念。我甚至分叉了十几个示例代码,但我仍然无法解决这个难题。

有人可以给我一个这个例子的提示,以便我能更好地理解这个概念并学习如何思考异步吗?谁(哪个线程)应该进行搜索以及谁应该进行绘画?

2 个答案:

答案 0 :(得分:0)

搜索功能需要移出UI线程。 UI线程正在运行搜索,无法同时更新UI。

最好的解决方案是使用BackgroundWorker进行搜索,并使用UI线程显示您想要的任何等待消息。

这是指向MSDN上有关如何使用BackgroundWorker的教程的链接: https://msdn.microsoft.com/en-us/library/cc221403%28v=vs.95%29.aspx

答案 1 :(得分:0)

使用.net 4.5,使用async / await

private async void btnSearchClick(object sender, EventArgs e)
    {
        label1.Text = "Searching";
        await Task.Run(() => { Thread.Sleep(5000); dataGridView1.Refresh();/*search here*/ });
        label1.Text = "Finished"; ;
    }

使用.net 4,使用Task with Invoking for main thread

private  void btnSearchClick(object sender, EventArgs e)
    {
        label1.Text = "Searching";
        Task.Run(() => {
            Thread.Sleep(5000);               
            this.BeginInvoke((Action)(() =>
            {
                dataGridView1.Refresh();/*search here*/
                label1.Text = "Finished";
            }));                
        });
        ;
    }