C# 异步搜索一组数据,并显示响应“响应”;“正在加载…”;消息

C# 异步搜索一组数据,并显示响应“响应”;“正在加载…”;消息,c#,.net,winforms,C#,.net,Winforms,我被要求实现一个DataGridView,它显示大量数据(目前为100000行),并具有搜索功能。网格已经实现,搜索工作正常。当CPU搜索网格时,我需要一个合适的加载。。。信息或图片。唯一的问题是我的UI没有响应,它会停止(挂起)直到搜索完成 我尝试了gif,但它没有收到足够的CPU时间,所以它就像一个死图像。 我尝试了一个带有“加载…”信息的标签,标签上的圆点被及时添加,看起来很有活力,但也挂着 我是线程和异步编程新手。我搜索了很多,但没有得到完整的概念。我甚至分出了十几个示例代码,但仍然无法

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

我尝试了
gif
,但它没有收到足够的CPU时间,所以它就像一个死图像。 我尝试了一个带有“加载…”信息的标签,标签上的圆点被及时添加,看起来很有活力,但也挂着

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


有人能用这个例子给我一个提示,让我更好地理解这个概念并学习如何异步思考吗?谁(哪个线程)应该执行搜索,谁应该执行绘制?

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

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

这里有一个指向MSDN教程的链接,该教程介绍了如何使用
BackgroundWorker
s:
对于.net 4.5,使用异步/等待

private async void btnSearchClick(object sender, EventArgs e)
    {
        label1.Text = "Searching";
        await Task.Run(() => { Thread.Sleep(5000); dataGridView1.Refresh();/*search here*/ });
        label1.Text = "Finished"; ;
    }
对于.NET4,使用带有主线程调用的任务

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";
            }));                
        });
        ;
    }

从用户体验的角度来看,100000行的网格有什么可能的用途?在我看来,这是一个毫无用处的要求,应该向你的上级提出质疑。真正地滚动条移动的1px大约为100行。无意义。添加“无意义”评论:这也是有害的,因为用户可能倾向于依赖这样的大视图,试图让自己快速了解数据的一般性质。事实证明,对于超过6000条记录的任何记录,人类在这方面都非常糟糕,反而会在网格中真正包含的内容上严重误导自己。我完全同意你的观点,问题是,负责人出于各种原因想要手头上的全部数据,而根据他们的网络和距离状况,这些原因并不坏;使用
wait Task.Run()
。问题是我的搜索方法占用了所有CPU时间,而后台工作程序(我已经尝试过)没有从CPU获得足够的时间,因此绘制作业失败。感谢您的回复,如果我希望消息是交互式的,该怎么办?我的意思是每500毫秒增加点,直到有3个点,然后这些点消失,然后重复。在这个场景中,我想快速刷新UI。创建您自己的控件,在该控件中有2个方法,Start()和Stop(),在方法Start()中使用Timer为每500ms添加/删除点,Stop()将停止Timer。最后在搜索函数中调用yourControl.Start()和Stop()